gpt4 book ai didi

python - 在 Python 中实现 OpenSSL AES 加密

转载 作者:行者123 更新时间:2023-11-28 21:25:41 25 4
gpt4 key购买 nike

我正在尝试在 Python 中实现以下内容:openssl enc -e -aes-256-cbc -base64 -k "Secret Passphrase"-in plaintext.txt -out ciphertext.txt

openssl enc -d -aes-256-cbc -base64 -k "Secret Passphrase"-in ciphertext.txt -out verification.txt

我尝试了几种不同的模块,PyCrypto、M2Crypto 等,但似乎无法获得将密码更改为正确大小的 key 并正确编码所有内容的正确组合。我找到了 https://github.com/nvie/SimpleAES但这基本上是在命令行上运行 OpenSSL,我宁愿避免这样做。

最佳答案

Base 64 编码和解码可以通过标准的 base64 模块轻松处理。

PyCrypto 和 M2Crypto 均支持 CBC 模式下的 AES-256 解密和加密。

唯一的非标准(也是最困难的)部分是从密码推导 IV 和 key 。 OpenSSL 通过它自己的 EVP_BytesToKey 函数来完成它,描述为 in this man page .

Python 等价物是:

def EVP_BytesToKey(password, salt, key_len, iv_len):
"""
Derive the key and the IV from the given password and salt.
"""
from hashlib import md5
dtot = md5(password + salt).digest()
d = [ dtot ]
while len(dtot)<(iv_len+key_len):
d.append( md5(d[-1] + password + salt).digest() )
dtot += d[-1]
return dtot[:key_len], dtot[key_len:key_len+iv_len]

对于 AES-256,key_len 是 32,iv_len 是 16。该函数返回可用于解密有效负载的 key 和 IV。

OpenSSL 在加密有效载荷的前 8 个字节中放置并期望加盐。

最后,CBC 模式下的 AES 只能处理与 16 字节边界对齐的数据。使用的默认填充是 PKCS#7。

因此加密的步骤是:

  1. 生成 8 个字节的随机数据作为盐。
  2. 使用步骤 1 中的盐从密码中导出 AES key 和 IV。
  3. 使用 PKCS#7 填充输入数据。
  4. 使用第 2 步中的 key 和 IV 在 CBC 模式下使用 AES-256 加密填充。
  5. 在 Base64 中编码并输出步骤 1 中的盐。
  6. 进行Base64编码,输出第4步的加密数据。

解密的步骤是相反的:

  1. 将输入数据从 Base64 解码为二进制字符串。
  2. 将解码数据的前 8 个字节视为盐。
  3. 使用步骤 1 中的盐从密码中导出 AES key 和 IV。
  4. 使用 AES key 和步骤 3 中的 IV 解密剩余的解码数据。
  5. 验证并从结果中删除 PKCS#7 填充。

关于python - 在 Python 中实现 OpenSSL AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13907841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com