1

我正在用 Lisp 编写一个 Web 服务器来处理 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 字节长。我的问题来了:我使用“client_write_key”使用 RC4 解密了这 317 个字节,然后我得到了#(148 104 81 182 67 111 28 201 202 50 207 57 126 209 19 ...)无法转换为文本的数据。我想我应该得到类似的东西GET / HTTP/1.1。我怎么了?

谢谢。

4

1 回答 1

1

RC4 是一种流密码,根据RFC 5246 的第 6.2.3.1 节,“对于不使用同步向量的流密码(例如 RC4),一条记录末尾的流密码状态仅用于后续的包。”

因此,您解密的第一条记录是 FINISHED 消息,并且您解密的第一个应用程序数据应该具有 RC4 状态,因为它是在解密 FINISHED 消息后留下的。

于 2014-05-28T23:20:15.993 回答