Первая строка зашифрованных готовых данных - IV. Поэтому в расшифрованном выводе вам необходимо удалить первые 16 байтов, что дает нам:
14 00 00 0C 00 02 00 00 00 00 00 0C E9 3F D3 D8
55 7A 3E B9 57 4D 25 94 3E 01 F7 97 B9 82 A5 ED
35 CE 26 85 20 EF 74 75 14 44 41 EA 03 03 03 03
Начиная с конца, у нас есть следующие разделы:
PADDING (4 байта)
Последние четыре байта (03 03 03 03
) заполнены, поэтому мы можем их пропустить.
MAC (20 байтов)
Следующие 20 байтов (3e 01 f7 97 b9 82 a5 ed 35 ce 26 85 20 ef 74 75 14 44 41 ea
) - это HMAC-SHA1, рассчитанный особым образом: сначала нужно добавить эпоху + порядковый номер сообщения (в нашем случае 00 01 00 00 00 00 00 00
), а затем добавить заголовок записи TLS (без эпохи и порядковый номер) с размером содержимого, установленным на фактический размер содержимого (в нашем случае 0x18
):
00 01 00 00 00 00 00 00 16 FE FF 00 18 14 00 00
0C 00 02 00 00 00 00 00 0C E9 3F D3 D8 55 7A 3E
B9 57 4D 25 94
Давайте сохраним его в файл с именем handshake-client-finished-without-mac.bin
и вызовем openssl:
$ openssl dgst -sha1 -hmac $(cat client-mac-key.bin) handshake-client-finished-without-mac.bin
HMAC-SHA1(handshake-client-finished-without-mac.bin)= 3e01f797b982a5ed35ce268520ef7475144441ea
MAC-ключ клиента (из сгенерированного вами блока ключей):
49 21 65 4A 07 1C 95 E2 DD B8 E3 A8 16 22 58 FA
AC FF DD 8D
Мы только что убедились, что MAC правильный. Давайте двигаться вперед с байтами сообщения.
ПРОВЕРКА ДАННЫХ (12 байт)
Следующие 12 байтов (E9 3F D3 D8 55 7A 3E B9 57 4D 25 94
) - это данные проверки. Вы правильно извлекли байты из всех предыдущих сообщений. Теперь нам нужно вычислить MD5 и SHA1-хэш этих байтов:
$ openssl dgst -md5 to_hash.bin
MD5(to_hash.bin)= fcc3d19566dc07777834ebddf9dd5dc4
$ openssl dgst -sha1 to_hash.bin
SHA1(to_hash.bin)= 2b069b971ceb63e2f0e6d2687479a10b0aee6abd
Затем объедините их (md5 + sha1) и сохраните их в client-data-for-prf.bin
. Наконец, мы вычисляем 12 байтов, используя функцию PRF (я использовал мою реализацию PRF из github ):
.\PRF.exe -l "client finished" -s .\master-secret.bin -d .\client-data-for-prf.bin -o
client-prf-result.bin -n 12
client-prf-result.bin
будет содержать байты, равные проверочным данным из зашифрованного сообщения.
ЖАТКА ДЛЯ РУЧКИ (12 байт)
Offset Field
00 Handshake Type: Finished (20)
01 Length: 12
04 Message Sequence: 2
06 Fragment Offset: 0
09 Fragment Length: 12
Примечание
Если вы когда-нибудь застряли во время игры с TLS, вы можете проверить журналы отладки Wireshark, которые многое раскрывают о том, что происходит на проводе. Щелкните правой кнопкой мыши по любому из кадров DTLS и откройте настройки протокола:
Затем установите предварительный общий ключ, который у вас уже есть, и выберите файл, в который вы хотите сохранить журналы:
Нажмите OK, и Wireshark расшифрует ваши данные TLS и предоставит вам много подробной информации в файле журнала.