AES使用相同的密钥和IV加密明文一样反复

问题描述:

这里得到不同的结果是我的代码:AES使用相同的密钥和IV加密明文一样反复

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(生) “ 这对我来说非常混乱,因为我使用了相同的KEY和IV。

我想建立一个API-系统,我需要别人发布他们的加密数据,不管他们使用哪种语言,只是想在AES中得到相同的结果。

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

我的意思是我想在使用相同的KEY和IV来加密相同的明文时得到相同的结果。

+0

某处,您的IV正在重新初始化。我在Golang AES实施中发生了这种情况。您需要阅读文档以了解每一步的功能。 –

+0

将AES.new(key,AES.MODE_CBC,IV = iv)更改为generator = AES.new(key,AES.MODE_CBC,iv)并参见 –

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

+0

谢谢!它真的解决了我的问题! – Jolly23