1

作为一项自学练习,我正在尝试学习如何使用一些 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 个字节。我认为这可能是一个打字问题,但我不知道如何纠正它。任何人都可以帮忙吗?

谢谢!

4

3 回答 3

1

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

所以你的 IV 字符串是 32 字节长,因为你从ciphertext.

于 2012-07-20T17:29:05.773 回答
1

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

iv = binascii.unhexlify(密文[:32])

或者

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

于 2013-04-10T02:23:19.070 回答
0

告诉计算机您正在处理十六进制。它把它当作一个字符串。iv = iv.decode('hex');

于 2015-02-13T23:19:27.120 回答