Python 中的 AES 128

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32160121/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 11:08:03  来源:igfitidea点击:

AES 128 in Python

pythoncryptographyaespycrypto

提问by TomasG

I don't know why when I encrypt in AES a text with the PyCrypto (Crypto.Cipher- AES), the result isn't the same as the ciphertext generate by a code in C.

我不知道为什么当我在 AES 中使用 PyCrypto (Crypto.Cipher-AES) 加密文本时,结果与 C 中的代码生成的密文不同。

For example, the following code gives me

例如,下面的代码给了我

99756ed0115f676cef45ae25937bfd63247358a80803dde3fc1eae4953ee7277

instead of

代替

CC613A0BDC930DABEA7A26126CE489EA

here is my code:

这是我的代码:

key = '1F61ECB5ED5D6BAF8D7A7068B28DCC8E'
IV = 16 * '\x00'
mode = AES.MODE_CBC
encryptor = AES.new(key, mode, IV=IV)
text = '020ABC00ABCDEFf8d500000123456789'
ciphertext = encryptor.encrypt(text)
print binascii.hexlify(ciphertext)

采纳答案by Roland Smith

You need to unhexlifyboth the key and text (example in IPython using Python 3);

您需要unhexlify密钥和文本(在使用 Python 3 的 IPython 中的示例);

In [1]: from Crypto.Cipher import AES

In [2]: import binascii

In [3]: import os

In [4]: key = binascii.unhexlify('1F61ECB5ED5D6BAF8D7A7068B28DCC8E')

In [5]: IV = os.urandom(16)

In [6]: binascii.hexlify(IV).upper()
Out[6]: b'3C118E12E1677B8F21D4922BE4B2398E'

In [7]: encryptor = AES.new(key, AES.MODE_CBC, IV=IV)

In [8]: text = binascii.unhexlify('020ABC00ABCDEFf8d500000123456789')

In [9]: ciphertext = encryptor.encrypt(text)

In [10]: print(binascii.hexlify(ciphertext).upper())
b'2133D236609558353F7C501E6EBBB8D9

Edit:As André Caron correctly states in the comments, it is generally a bad ideato use an IV consisting of only zeroes. I've changed the code to use a random IV. Note that the IV should also be communicated to the receiver; it is needed for decryption. Often the IV is prepended to the ciphertext.

编辑:正如 André Caron 在评论中正确指出的那样,使用仅由零组成的 IV通常是一个坏主意。我已将代码更改为使用随机 IV。请注意,IV 也应传达给接收者;解密需要它。通常在密文前面加上 IV。