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

环境

  • OpenSSL
  • Python

使用 OpenSSL 加密

1. 生成 AES 密钥和 IV

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

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

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

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

2. 加密

bash 复制代码
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 编码:

bash 复制代码
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. 解密

bash 复制代码
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 解码

bash 复制代码
openssl base64 -d -in ciphertext.txt -out ciphertext.bin

完整的流程总结

  1. 生成强密钥和 IV:

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

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

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

注意安全, HAVE FUN! 👀

相关推荐
CHNMSCS2 小时前
PyTorch_指定运算设备 (包含安装 GPU 的 PyTorch)
人工智能·pytorch·python
买了一束花5 小时前
二、机器学习中Python变量基础
开发语言·python·机器学习·conda
Gui林5 小时前
ros2 humble 控制真实机械臂(以lerobot为例)
linux·python
钢铁男儿5 小时前
Python基本语法(函数partial)
前端·javascript·python
满怀10156 小时前
【Robocorp实战指南】Python驱动的开源RPA框架
python·开源·rpa
bj32816 小时前
树的同构问题--Python
开发语言·python·算法
2501_915918417 小时前
iOS 性能调优实战:三款工具横向对比实测(含 Instruments、KeyMob、Xlog)
websocket·网络协议·tcp/ip·http·网络安全·https·udp
橙色小博7 小时前
HTTPS协议:更安全的HTTP
网络·python·网络协议·安全·http·https
小龙在山东7 小时前
flask 获取各种请求数据:GET form-data x-www-form-urlencoded JSON headers 上传文件
python·flask·json
纪元A梦7 小时前
华为OD机试真题——告警抑制(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od