我正在创建一个Python函数来使用PyCrypto模块执行计数器模式加密。我知道内置的,但想实现它自己。
我正在尝试从RFC 3686测试向量#1,并有正确的计数器块和正确的ASCII格式的密钥。但是当我使用密钥加密计数器块时,我没有得到预期的密钥流。
我的代码的相关部分:
cipher = AES.new(key)
ctr_block = iv + nonce + ctr
key_stream = base64.b64decode(cipher.encrypt(ctr_block))
我可以提供更多的代码,如果需要,但我不确定如何,因为ctr_block
和key
有许多问号字符,当我打印它们。
为什么我没有得到预期的答案?看起来一切都很正常。也许我在字符串的编码上犯了什么错误。
编辑
自包含的代码:
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
首先,正确的CTR块顺序是nonce + iv + ctr
。其次,base64.b64decode
调用是错误的:cipher.encrypt
产生一个解码的字符串。在这两个修复之后,你的代码打印0xb70x600x330x280xdb0xc20x930x1b0x410xe0x160xc80x60x7e0x620xdf
,这似乎是一个正确的密钥流。
首先,使用字节字符串:
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]: 'xaehRxf8x12x10gxccKxf7xa5vUwxf3x9e'
第二,你不应该使用base64。