2012-07-16 107 views
0

作为一项自学习练习,我试图学习如何使用一些pycrypto库。我需要使用AES解密CBC_MODE中的密文字符串。我给出了密文,密钥和IV。这里是我写的代码:使用pycrypto进行AES解密

from Crypto.Cipher import AES 

mode = AES.MODE_CBC 
key = "a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1" 
ciphertext = "a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1"; 

iv = ciphertext[:32] 
ciphertext = ciphertext[32:] 
decryptor = AES.new(key, mode, iv) 
plaintext = decryptor.decrypt(ciphertext) 
print plaintext 

当我运行它,我得到以下错误:

ValueError: IV must be 16 bytes long

我知道IV字符串是32个进制的字符,因此,16个字节。我认为这可能是一个打字问题,但我不知道如何纠正它。谁能帮忙?

谢谢!

回答

1

您的字符串只包含十六进制字符,但它们仍然是纯字符串,因此每个字符都是有效的。

所以你的IV字符串是32字节长,因为你从ciphertext中切出它。

0

我怀疑你是对的,这是打字。尝试其中之一:

IV = binascii.unhexlify(密文[32])

IV =长(密文[32],16)

0

给计算机时正在处理十六进制。它将它视为一个字符串。 iv = iv.decode('hex');

+0

这将有助于解释**如何**告诉他正在使用十六进制计算机。 – kdopen 2015-02-13 23:33:23