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)并参见