使用pycrypto进行AES解密

时间:2012-07-16 06:39:00

标签: aes pycrypto

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

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必须是16个字节长

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

因此,当您从ciphertext切出时,您的IV字符串长度为32个字节。

答案 1 :(得分:1)

我怀疑你是对的,而且还打算打字。尝试其中之一:

iv = binascii.unhexlify(ciphertext [:32])

iv = long(密文[:32],16)

答案 2 :(得分:0)

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