AES通过使用相同的密钥和iv来重复加密相同的明文得到不同的结果

时间:2017-04-26 08:38:18

标签: 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来加密相同的明文时,我希望得到相同的结果。

1 个答案:

答案 0 :(得分:2)

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

在这种情况下代码

raw += (16 - len(raw) % 16) * '\0'
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'
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被设置为最后一个完整的密文块。

如果假定raw为任意长度,则以下内容相当于只有密文的最后一个块用作下一次加密的IV:

raw += (16 - len(raw) % 16) * '\0'
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初始化generator