Skip to main content
 首页 » 编程设计

python之PyCryptoDome : AES-256 giving different output with same key & data

2025年05月04日23落叶无声

以下代码每次执行时都会生成不同的密文,这不应该发生,因为每次执行传递的 key 和数据都是相同的。

from Crypto.Cipher import AES 
from Crypto.Util.Padding import pad 
from base64 import b64encode, b64decode 
 
key = '/I02fMuSSvnouuu+/vyyD7NuSEVDB/0gte/z50dM0b4=' 
data = 'hello world!' 
 
cipher = AES.new(b64decode(key), AES.MODE_CBC) 
padded_data = pad(data.encode(), cipher.block_size) 
print(b64encode(padded_data)) 
# b'aGVsbG8gd29ybGQhBAQEBA==' 
ciphertext = cipher.encrypt(padded_data) 
print(b64encode(ciphertext)) 
# b'rEHH0MWIWCWUldjYBco9TA==' 
ciphertext = cipher.encrypt(padded_data) 
print(b64encode(ciphertext)) 
# b'FTpLrkZttDxMlpre3Kq8qQ==' 

我实际上是在尝试将示例 PHP 代码复制到 Python,PHP 代码提供相同的输出,而我的 Python 代码提供不同的输出,没有一个与 PHP 代码匹配。

Python 版本 3.6.x
PyCryptoDome 版本 3.4.7

请您参考如下方法:

每次在 CBC 模式下使用 Pycryptodome 生成 AES 密码对象时,都会创建并使用随机 IV。它可以作为名为 iv 的属性访问(例如 cipher.iv)。

独特(且不可预测)的 IV 实现了随机化输出的目标,即使同一条消息被多次加密(使用相同的 key ),这是攻击者经常可以利用的一条信息。

您没有显示 PHP 代码,但是如果它的输出每次都NOT 改变,这意味着 IV 是固定的并且代码存在安全漏洞。