如何在pycryptodome中设置chacha20-poly1305的块计数器

时间:2019-06-10 12:29:36

标签: python encryption pycryptodome

我当前正在尝试解密OpenSSH数据包,该数据包使用chacha20-poly1305加密。到目前为止,我可以解密数据包的长度并检查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个字节。
效果很好!

现在,我继续使用加密密钥的第一部分解密相同的随机数和有效载荷:

        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开始!

0 个答案:

没有答案