Как установить счетчик блоков для chacha20-poly1305 в pycryptodome - PullRequest
1 голос
/ 10 июня 2019

В настоящее время я пытаюсь расшифровать пакеты 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 - это шестнадцатеричное представление второй части ключа шифрования, а шифр [: 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!

...