环境
- 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)
-
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
完整的流程总结
-
生成强密钥和 IV:
- 使用 Python 的
secrets
模块。 - 将密钥和 IV 保存到安全的文件中(例如,
key.txt
和iv.txt
), 或者密码管理器中。
- 使用 Python 的
-
加密:
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
-
解密:
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! 👀