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

Python AES通过使用相同的密钥和iv重复加密相同的明文来获得不同的结果,python,encryption,aes,pycrypto,cbc-mode,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_C

这是我的密码:

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)”时,我都会得到不同的结果 我很困惑,因为我使用了相同的钥匙和IV

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

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


我的意思是,当我使用相同的密钥和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是根据定义在内部推进的。这意味着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初始化
生成器。

在某个地方,您的IV正在重新初始化。这发生在我在Golang AES实现中。您需要浏览文档以了解每个步骤的作用。将AES.new(key,AES.MODE_CBC,IV=IV)更改为generator=AES.new(key,AES.MODE_CBC,IV)并参见