当前位置: 首页 > article >正文

使用 OpenSSL 和 Python 实现 AES-256-CBC 加密与解密(安全密钥管理)

环境

  • OpenSSL
  • Python

使用 OpenSSL 加密

1. 生成 AES 密钥和 IV

强烈推荐使用方法一(Python secrets 模块),因为它更安全。

方法一: Python 的 secrets 模块(安全方式)
  • 不要使用 OpenSSL 的 rand 命令直接生成密钥和 IV 用于生产环境。 尽管 openssl rand 可以生成随机数,但它可能不符合密码学安全的要求。

  • 推荐方法: 使用更安全的随机数生成器,例如 Python 的 secrets 模块:

    import secrets
    import binascii
    
    # 生成 256 位 AES 密钥(32 字节)
    key = secrets.token_bytes(32)
    key_hex = binascii.hexlify(key).decode()  # 转换为十六进制字符串
    
    # 生成 128 位 IV(16 字节)
    iv = secrets.token_bytes(16)
    iv_hex = binascii.hexlify(iv).decode()  # 转换为十六进制字符串
    
    print("AES Key (Hex):", key_hex)
    print("IV (Hex):", iv_hex)
    
  • secrets.token_bytes(nbytes) 生成 nbytes 个密码学安全的随机字节。

  • binascii.hexlify(data) 将字节数据转换为十六进制字符串。

  • 保存: 将生成的密钥和 IV 安全地保存起来(例如,使用密码管理器)。

方法二: 直接使用 OpenSSL 的 rand 命令(不推荐)
openssl rand -hex 32  # 生成 256 位 AES 密钥(32 字节)
openssl rand -hex 16  # 生成 128 位 IV(16 字节)
  • openssl rand -hex <长度> 使用 OpenSSL 的随机数生成器生成指定长度的十六进制字符串。
  • 保存密钥和 IV: 将生成的密钥和 IV 安全地保存起来(例如,存储在密码管理器中)。

2. 加密

openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)
  • -pbkdf2 使用 PBKDF2 密钥派生函数。
  • -iter 100000 设置迭代次数为 100000(建议至少 10000,可以根据需要调整)。
  • -K $(cat key.txt) 从文件 key.txt 中读取 AES 密钥(假设你已将密钥保存在 key.txt 文件中)。
  • -iv $(cat iv.txt) 从文件 iv.txt 中读取 IV(假设你已将 IV 保存在 iv.txt 文件中)。
  • 去掉了-salt: 当使用-pbkdf2的时候,不再需要-salt
  • 为什么要从文件中读取密钥和 IV?
    • 安全: 避免将密钥和 IV 直接写在命令行中,防止泄露(例如,通过命令行历史记录)。
    • 方便: 方便管理和重复使用密钥和 IV。

3. Base64 编码

将密文转换为文本格式(用于生成条形码),需要进行 Base64 编码:

openssl base64 -in ciphertext.bin -out ciphertext.txt

4. 生成条形码

  • 使用在线条形码生成器(如 https://barcode.tec-it.com/en)将 Base64 编码后的密文生成条形码图片。
  • 选择条形码类型(如 Code 128),将 Base64 编码后的密文粘贴到输入框中,生成条形码图片。

安全传输密钥和密文

1. 安全传输密钥:

  • 重要: 密钥和 IV 的安全至关重要!绝对不要通过不安全的渠道(如微信、邮件 💀)直接发送。
  • 安全方案:
    • 线下告知: 如果条件允许,线下口头告知或使用纸条传递。
    • 加密通信工具: 使用 Signal、Wire 等端到端加密的通信工具。
    • 密钥交换协议: 如果对密码学有一定了解,可以使用 Diffie-Hellman 等密钥交换协议。
    • 密钥文件: 可以将密钥和IV存放在一个文件中, 使用 GPG 加密后发送.

2. 发送条形码:

  • 将生成的条形码图片通过微信等方式发送给你的朋友。这步可以用微信了。😇

解密方式

1. 解密

openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000
  • 注意:
    • 解密命令与加密命令 基本相同,只是将 -enc 改为 -d(表示解密)。
    • -pbkdf2-iter 参数必须与加密时 完全一致
    • -K-iv 参数仍然从文件中读取密钥和 IV。

2. Base64 解码

openssl base64 -d -in ciphertext.txt -out ciphertext.bin

完整的流程总结

  1. 生成强密钥和 IV:

    • 使用 Python 的 secrets 模块。
    • 将密钥和 IV 保存到安全的文件中(例如,key.txtiv.txt), 或者密码管理器中。
  2. 加密:

    openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)
    
    openssl base64 -in ciphertext.bin -out ciphertext.txt
    
  3. 解密:

    openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000
    
    openssl base64 -d -in ciphertext.txt -out ciphertext.bin
    

注意安全, HAVE FUN! 👀


http://www.kler.cn/a/582195.html

相关文章:

  • Spring Boot 与 Spring MVC 有何不同
  • f QT测试
  • 微服务的认识与拆分
  • Ubuntu用户安装cpolar内网穿透
  • 实战:DHCP服务器配置与防御欺骗攻击(附华为设备命令)
  • react基础语法视图层类组件
  • 如何精准打点解决卡牌、SLG、开放大世界、放置类游戏卡顿难题
  • 洗鞋小程序(源码+文档+讲解+演示)
  • 基于SpringBoot的美食信息推荐系统设计与实现(源码+SQL脚本+LW+部署讲解等)
  • C++设计模式总结
  • Java中的四种排序算法详解
  • 【JavaWeb学习Day24】
  • 【langchain/入门】使用langchain调用本地部署的大模型(以llama.cpp以及ollama为例)
  • excel的导入和下载(poi)
  • 强化科技内核 “人工智能+”助力农业新质生产力飞跃
  • Hexo博客Icarus主题不蒜子 UV、PV 统计数据初始化配置
  • LVTTL(Low Voltage Transistor-Transistor Logic)电平详解
  • K8S中MySQL配置持久化存储
  • Go 语言入门指南
  • OPPO手机怎么录制屏幕?屏幕录制软件分享