1

我目前正在尝试解密使用 chacha20-poly1305 加密的 OpenSSH 数据包。到目前为止,我可以解密数据包长度并检查 MAC(我使用的是 pycryptodome),但是当我尝试解密有效负载时,它只会返回乱码输出。

我正在使用以下方法解密长度:

    nonce = int(seqnr).to_bytes(8, 'big')  
    cipher_len = ChaCha20.new(key=key1_hex, nonce=nonce)  
    length = cipher_len.decrypt(binascii.a2b_hex(cipher[:8]))  

而 seqnr 是数据包序列号,key1_hex 是加密密钥第二部分的十六进制表示,cipher[:8] 是数据包的前 4 个字节。
这很好用!

现在我继续使用加密密钥的第一部分解密相同的 nonce 和有效负载:

        cipher_chacha = ChaCha20.new(key=key2_hex, nonce=int(seqnr).to_bytes(8, 'big'))
        ciphertext = cipher_chacha.decrypt(binascii.a2b_hex(cipher[8:-32]))

在此https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.chacha20poly1305文档之后,openssh github 站点告诉我,我必须使用块计数器 1 来解密有效负载。但是在https://pycryptodome.readthedocs.io/en/latest/src/cipher/chacha20_poly1305.html#chacha20-poly1305的文档中,似乎没有定义块计数器编号的选项(似乎它开始默认为 0,因为标签的验证对我有用)。
这是真的?还是我错过了什么?直到现在它都不起作用,我很确定这一定是因为块计数器的错误开始。

编辑:解决方案是在解密之前调用 cipher_chacha.seek(64) !然后它将从块计数器 1 开始!

4

0 回答 0