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来加密相同的明文时得到相同的结果。
答
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
某处,您的IV正在重新初始化。我在Golang AES实施中发生了这种情况。您需要阅读文档以了解每一步的功能。 –
将AES.new(key,AES.MODE_CBC,IV = iv)更改为generator = AES.new(key,AES.MODE_CBC,iv)并参见 –