Расшифруйте chacha20poly1305 через SSH, используя ключи, полученные из памяти - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь расшифровать chacha20 через соединение SSH, используя ключи, полученные из памяти. Исходный код, который я отслеживаю и откуда я беру ключи, находится здесь: https://github.com/openssh/openssh-portable

После документа: https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.chacha20poly1305#L47 который описывает использование chacha20 в OpenSSH и то, как ключи получены, ключ разделен на две части, из которых одна часть используется для шифрования длины, а другая для полезной нагрузки.
Одноразовый номер, который используется, является порядковым номером пакета.

Теперь мой вопрос. Какой порядковый номер здесь имеется в виду?

Я использую tcpdump для получения информации о пакете для соединения, и есть порядковый номер (код показан ниже), но, похоже, он не работает. Я также пытался использовать 1 или 0 в качестве порядкового номера, но он также не работал. Я использовал порядковый номер как байтовый массив, что-то вроде b'\x00\x00\x00\x00\x00\x00\x00\x01'

Может, кто-то из вас видит проблему? Большое спасибо заранее

Один пакет Tcpdump:

09:42:05.231752 IP 192.168.12.29.35144 > 192.168.12.46.ssh: Flags [P.], seq 2723642976:2723643012, ack 716398578, win 452, options [nop,nop,TS val 1806461459 ecr 4294897807], length 36  
    0x0000:  4510 0058 b419 4000 4006 ecda c0a8 0c1d  
    0x0010:  c0a8 0c2e 8948 0016 a257 7e60 2ab3 5ff2  
    0x0020:  8018 01c4 99e6 0000 0101 080a 6bac 6a13  
    0x0030:  fffe f08f 724b 5259 1a86 cba9 11b8 ef0e  
    0x0040:  57f1 2236 2ca9 6751 1790 db5d 5247 7484  
    0x0050:  2438 2485 7103 1f22

Ключ1 и ключ2:

30A9C075103A628BABC8735785F075ECCD4E7E9C5BDB784B1DC0EDAB141F3B9C 3A5ADB494C9D13711EF2739ACC606150AFF32BF05C51910E1AC28460AB71998E

шифр (исключая заголовки):

724B52591A86CBA911B8EF0E57F122362CA967511790DB5D524774842438248571031F22

Мой pycrytodome код для расшифровки:

key1_hex = binascii.a2b_hex(key1)
seqnr_hex = binascii.a2b_hex(seqnr)
cipher_len = ChaCha20.new(key=key1_hex, nonce=seqnr_hex)
length = cipher_len.decrypt(binascii.a2b_hex(cipher[:8]))
cipher_chacha = ChaCha20.new(key=binascii.a2b_hex(key2), 
nonce=binascii.a2b_hex(seqnr))
ciphertext = cipher_chacha.decrypt(binascii.a2b_hex(cipher[8:]))
...