【发布时间】:2014-05-25 20:30:08
【问题描述】:
我正在用 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 的东西。我怎么了?
谢谢。
【问题讨论】:
-
您应该使用 server_write_key 而不是 client_write_key 解密。
-
@GregS 感谢您的回复。为什么使用 server_write_key?根据tools.ietf.org/html/rfc5246#page-81>,服务器写入密钥:用于加密服务器写入数据的密钥。
-
@GregS 我试过 server_write_key 但没有运气:(
-
我的错,我错过了你正在编写服务器,我以为你正在编写客户端。是的,您需要使用客户端写入密钥进行解密。不知道是什么问题,抱歉。
-
@GregS 你真是个天才!这就是我重置状态的问题。非常感谢!
标签: ssl encryption https lisp rc4-cipher