因此,我尝试使用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?
答案 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
(字节)初始化密码。