环境
- OpenSSL
- Python
使用 OpenSSL 加密
1. 生成 AES 密钥和 IV
强烈推荐使用方法一(Python secrets 模块),因为它更安全。
方法一: Python 的 secrets 模块(安全方式)
- 
不要使用 OpenSSL 的 rand命令直接生成密钥和 IV 用于生产环境。 尽管openssl rand可以生成随机数,但它可能不符合密码学安全的要求。
- 
推荐方法: 使用更安全的随机数生成器,例如 Python 的 secrets模块:pythonimport 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.txt4. 生成条形码
- 使用在线条形码生成器(如 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完整的流程总结
- 
生成强密钥和 IV: - 使用 Python 的 secrets模块。
- 将密钥和 IV 保存到安全的文件中(例如,key.txt和iv.txt), 或者密码管理器中。
 
- 使用 Python 的 
- 
加密: bashopenssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)bashopenssl base64 -in ciphertext.bin -out ciphertext.txt
- 
解密: bashopenssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000bashopenssl base64 -d -in ciphertext.txt -out ciphertext.bin
注意安全, HAVE FUN! 👀