AES使用同一个key和iv重复加密同一个明文得到不同的结果
AES get different results by using the same key and iv to encrypt the same plaintext repeatedly
这是我的代码:
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) * '[=10=]'
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-SYSTEM,我需要其他人post他们的加密数据,无论他们使用哪种语言,只是想在AES中得到相同的结果。
如何使用 AES 获得稳定的结果?
我的意思是我想用相同的KEY和IV加密相同的明文得到相同的结果
pycrypto 中的 AES
实现是 CBC 模式的状态。这种状态可以通过 IV 值来模拟。为简单起见,我们假设 raw
小于 16 个字节。
在那种情况下代码
raw += (16 - len(raw) % 16) * '[=10=]'
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) * '[=11=]'
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) * '[=12=]'
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
。
这是我的代码:
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) * '[=10=]'
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-SYSTEM,我需要其他人post他们的加密数据,无论他们使用哪种语言,只是想在AES中得到相同的结果。
如何使用 AES 获得稳定的结果?
我的意思是我想用相同的KEY和IV加密相同的明文得到相同的结果
pycrypto 中的 AES
实现是 CBC 模式的状态。这种状态可以通过 IV 值来模拟。为简单起见,我们假设 raw
小于 16 个字节。
在那种情况下代码
raw += (16 - len(raw) % 16) * '[=10=]'
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) * '[=11=]'
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) * '[=12=]'
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
。