使用 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! 👀

相关推荐
kszlgy4 小时前
Day 52 神经网络调参指南
python
wrj的博客5 小时前
python环境安装
python·学习·环境配置
Pyeako6 小时前
深度学习--BP神经网络&梯度下降&损失函数
人工智能·python·深度学习·bp神经网络·损失函数·梯度下降·正则化惩罚
星幻元宇VR6 小时前
走进公共安全教育展厅|了解安全防范知识
学习·安全·虚拟现实
摘星编程7 小时前
OpenHarmony环境下React Native:Geolocation地理围栏
python
充值修改昵称7 小时前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
2501_940198698 小时前
从“数据孤岛”到“智慧医脑”:实战 MCP 协议安全接入 HIS 系统,构建医疗级 AI 辅助诊断合规中台
人工智能·安全·asp.net
上海云盾第一敬业销售8 小时前
高防CDN在网站安全性能提升中的架构解析
安全·ddos
不灭锦鲤9 小时前
每天看一种漏洞类型,oss存储桶
安全·web安全
q_35488851539 小时前
AI大模型:python新能源汽车推荐系统 协同过滤推荐算法 Echarts可视化 Django框架 大数据毕业设计(源码+文档)✅
大数据·人工智能·python·机器学习·信息可视化·汽车·推荐算法