使用pycryptodome中的aes-ctr解密的计数器块问题

时间:2019-05-16 12:04:59

标签: aes

因此,我尝试使用pycryptodome通过SSH解密连接。 我有从内存中提取的密钥和IV(我在虚拟环境中工作),它们都是100%正确的,用于加密数据。 现在,我想在以后解密这些内容。 我的代码如下:

key="1A0A3EBF96277C6109632C5D96AC5AF890693AC829552F33769D6B1A4275EAE2"
iv="EB6444718D73887B1DF8E1D5E6C3ECFC"

key_hex=binascii_a2b_hex(key)  
iv_hex=binascii_a2b_hex(iv)    
ctr = Counter.new(128, prefix=iv_hex, initial_value = 0)    
aes = AES.new(key, AES.MODE_CTR, counter = ctr)    
decrypted = aes.decrypt(binascii.a2b_hex(cipher).rstrip())    
print(decrypted)  

现在的问题是,对于块大小(在AES中为16字节)而言,计数器太大(32字节)。但是,我发现如果要解密AES-CTR加上initial_value设置为0,则需要IV作为计数器的前缀。 因此,我已经只有前缀的16字节。当我知道要将计数器对象中的第一个值设置为0时,它将不起作用。 甚至可以使用pycryptodome用16字节IV解密AES-CTR吗?也许有人看到我的错误。 任何帮助将非常感激。 预先感谢!

编辑:感谢SquareRootOfTwentyThree,我解决了pycryptodome问题。不幸的是,解密仍然无法正常工作,因此我打开了一个新线程。 openssh/opensshportable, which key should I extract from memory?

1 个答案:

答案 0 :(得分:0)

根据Chapter 4 in RFC4344,SSH使用SDCTR模式(有状态解密CTR模式),这意味着计数器块是一个128位计数器,从IV中以网络顺序编码的值开始,并且没有固定的部分(不同于NIST CTR模式)。

使用PyCryptodome,您可以执行以下操作:

aes = AES.new(key_hex, AES.MODE_CTR, initial_value=iv_hex, nonce=b'')

注意:代码中似乎存在错误-您使用key(十六进制字符串)而不是key_hex(字节)初始化密码。