python - AES使用相同的 key 和iv重复加密相同的明文得到不同的结果

标签 python encryption aes pycrypto cbc-mode

这是我的代码:

from Crypto.Cipher import AES
import binascii

def encrypt(secret_key, sign, raw):
    key = md5(secret_key).hexdigest()[::-2]
    iv = md5(sign).hexdigest()[::-2]
    raw += (16 - len(raw) % 16) * '\0'
    generator = AES.new(key, AES.MODE_CBC, IV=iv)

    #***********************************************
    #Problems occur at here ! 
    #If I execute "generator.encrypt(raw)"
    #The results are not same every time

    print generator.encrypt(raw) # result_1
    print generator.encrypt(raw) # result_2
    print generator.encrypt(raw) # result_3

    #***********************************************

    return binascii.b2a_hex(generator.encrypt(raw))

每次执行“generator.encrypt(raw)”时都会得到不同的结果 这对我来说很困惑,因为我使用了相同的 KEY 和 IV。

我想建立一个API-SY​​STEM,我需要其他人发布他们的加密数据,无论他们使用哪种语言,只是想在AES中得到相同的结果。

如何使用 AES 获得稳定的结果?

我的意思是,当我使用相同的 KEY 和 IV 加密相同的明文时,我希望得到相同的结果。

最佳答案

pycrypto 中的 AES 实现对于 CBC 模式是有状态的。这种状态性可以通过 IV 值来模拟。为简单起见,我们假设 raw 短于 16 个字节。

在这种情况下的代码

raw += (16 - len(raw) % 16) * '\0' # zero padding
generator = AES.new(key, AES.MODE_CBC, IV=iv)

print generator.encrypt(raw) # result_1
print generator.encrypt(raw) # result_2
print generator.encrypt(raw) # result_3

相当于

raw += (16 - len(raw) % 16) * '\0' # zero padding
generator = AES.new(key, AES.MODE_CBC, IV=iv)
ct1 = generator.encrypt(raw) 
print ct1 # result_1

generator = AES.new(key, AES.MODE_CBC, IV=ct1)
ct2 = generator.encrypt(raw) 
print ct2 # result_2

generator = AES.new(key, AES.MODE_CBC, IV=ct2)
ct3 = generator.encrypt(raw) 
print ct3 # result_3

原因是IV是根据CBC mode的定义在内部推进的。 。这意味着IV被设置为最后一个完整的密文 block 。

如果 raw 被假定为任意长度,则以下内容等效,其中仅将密文的最后一个 block 用作下一次加密的 IV:

raw += (16 - len(raw) % 16) * '\0' # zero padding
generator = AES.new(key, AES.MODE_CBC, IV=iv)
ct1 = generator.encrypt(raw) 
print ct1 # result_1

generator = AES.new(key, AES.MODE_CBC, IV=ct1[-16:])
ct2 = generator.encrypt(raw) 
print ct2 # result_2

generator = AES.new(key, AES.MODE_CBC, IV=ct2[-16:])
ct3 = generator.encrypt(raw) 
print ct3 # result_3

如果您不希望这样,则需要使用原始 IV 初始化生成器

关于python - AES使用相同的 key 和iv重复加密相同的明文得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43628997/

相关文章:

javascript - edx "Live Preview"和 "View Live Version"按钮未重定向到所需页面

python - 从 Atom 运行 Python

c - 如何解密使用 cbc_encrypt (Linux GCC) 加密的内容

c++ - 如何加密文本

c# - 为什么我的解密文本中出现随机字符?

用于 GAE 的 Python headless 浏览器

python - 是否可以从 Python 的 HDF5 文件中的复合数据集中读取字段名称?

c++旋转加密

python - 如何在 SliTaz 或 Haiku 上使用 AES 或 DES 算法

java - 在解密过程中,如何将GCM身份验证标签放在密码流的末尾需要内部缓冲?