PyCrypto AES加密无法按预期工作

时间:2013-03-31 23:45:38

标签: python aes pycrypto

我正在使用PyCrypto模块创建一个Python函数来执行计数器模式加密。我知道内置,但想自己实现它。

我正在尝试Test Vector #1 from RFC 3686,并拥有正确的计数器块和ASCII格式的正确密钥。但是当我使用密钥加密计数器块时,我没有得到预期的密钥流。

我的代码的相关部分:

cipher = AES.new(key)
ctr_block = iv + nonce + ctr
key_stream = base64.b64decode(cipher.encrypt(ctr_block))

如果需要,我可以提供更多代码,但我不确定当我打印它们时,ctr_blockkey有多个问号字符。

为什么我没有得到预期的答案?似乎一切都应该正确。也许我对字符串的编码犯了一些错误。

修改

自包含代码:

from Crypto.Cipher import AES
import base64

def hex_to_str(hex_str):
    return str(bytearray([int(n, 16) for n in hex_str.split()]))

key = hex_to_str("AE 68 52 F8 12 10 67 CC 4B F7 A5 76 55 77 F3 9E")
iv = hex_to_str("00 00 00 00 00 00 00 00")
nonce = hex_to_str("00 00 00 30")
ctr = hex_to_str("00 00 00 01")

cipher = AES.new(key)
ctr_block = iv + nonce + ctr
key_stream = base64.b64decode(cipher.encrypt(ctr_block))

print "".join([hex(ord(char)) for char in key_stream])
# 0xd90xda0x72

2 个答案:

答案 0 :(得分:1)

首先,使用字节字符串:

In [14]: keystring = "AE 68 52 F8 12 10 67 CC 4B F7 A5 76 55 77 F3 9E"

In [15]: keystring.replace(' ', '').decode('hex')
Out[15]: '\xaehR\xf8\x12\x10g\xccK\xf7\xa5vUw\xf3\x9e'

其次,你不应该使用base64。

答案 1 :(得分:1)

首先,正确的点击率阻止顺序为nonce + iv + ctr。其次,base64.b64decode调用错误:cipher.encrypt生成解码后的字符串。完成这两项修复后,您的代码将打印0xb70x600x330x280xdb0xc20x930x1b0x410xe0x160xc80x60x7e0x620xdf,这似乎是正确的密钥流。