Как расшифровать данные на прикладном уровне HTTPS?

Я пишу веб-сервер с Lisp для обработки HTTPS-запроса. Я выполнил TLS 1.2 и уже завершил процесс рукопожатия. Я выбрал набор шифров TLS_RSA_WITH_RC4_128_SHA. Я уже вычислил client_write_MAC_secret, server_write_MAC_secret, client_write_key, server_write_key. Эти ключи кажутся правильными, потому что я могу расшифровать сообщение «Готово» из браузера и проверить данные внутри. Я также проверяю HMAC слоя записи. Затем я отправляю с сервера сообщения «Изменить спецификацию шифра» и «Готово». Пока все работает нормально.

Затем я получил сообщение от браузера, начинающееся с #(23 3 3 1 61 ...). 23 означает, что это данные приложения. #(3 3) означает TLS 1.2. #(1 61) означает, что длина равна 256+61=317, что правильно, потому что оставшиеся данные действительно имеют длину 317 байт. Вот мой вопрос: я расшифровал эти 317 байтов с помощью RC4, используя «client_write_key», после чего я получил такие данные, как #(148 104 81 182 67 111 28 201 202 50 207 57 126 209 19 ...), которые не могут быть преобразованы в текст. Я думал, что должен получить что-то вроде GET / HTTP/1.1. Что я делаю неправильно?

Спасибо.


person Wise Simpson    schedule 25.05.2014    source источник
comment
Вы должны расшифровывать с помощью server_write_key, а не client_write_key.   -  person President James K. Polk    schedule 26.05.2014
comment
@GregS Спасибо за ответ. Зачем использовать server_write_key? Согласно ‹tools.ietf.org/html/rfc5246#page-81. ›, ключ записи сервера: ключ, используемый для шифрования данных, записываемых сервером.   -  person Wise Simpson    schedule 26.05.2014
comment
@GregS Я пробовал server_write_key, но безуспешно :(   -  person Wise Simpson    schedule 26.05.2014
comment
Плохо, я пропустил, что ты пишешь сервер, я думал ты пишешь клиент. Да, вам нужно расшифровать с помощью ключа записи клиента. Я не знаю, в чем проблема, извините.   -  person President James K. Polk    schedule 26.05.2014
comment
@GregS Ты гений! В том то и проблема, что я сбросил состояние. Большое спасибо!   -  person Wise Simpson    schedule 27.05.2014
comment
@GregS: не могли бы вы поместить это в ответ?   -  person Svante    schedule 27.05.2014


Ответы (1)


RC4 — это потоковый шифр, и согласно RFC 5246, раздел 6.2.3.1, «Для потоковых шифров, которые не используют вектор синхронизации (например, RC4), состояние потокового шифра с конца одной записи просто используется в последующем пакете».

Таким образом, первая запись, которую вы расшифровываете, — это сообщение FINISHED, а первые данные приложения, которые вы расшифровываете, должны иметь состояние RC4, которое осталось после расшифровки сообщения FINISHED.

person President James K. Polk    schedule 28.05.2014