Ssl 如何在HTTPS的应用层解密数据?

Ssl 如何在HTTPS的应用层解密数据?,ssl,encryption,https,lisp,rc4-cipher,Ssl,Encryption,Https,Lisp,Rc4 Cipher,我正在用Lisp编写一个web服务器来处理HTTPS请求。我遵循并已经完成了握手过程。我选择的密码套件是TLS\u RSA\u和RC4\u 128\u SHA。我已经计算了客户端写入MAC密钥、服务器写入MAC密钥、客户端写入密钥、服务器写入密钥。这些密钥似乎是正确的,因为我可以解密来自浏览器的“完成”消息并验证其中的数据。我还验证了记录层的HMAC。然后我从服务器发送“更改密码规范”和“完成”。到目前为止,一切似乎都很顺利 然后,我从浏览器中收到了以#(23 3 3 1 61…开头的消息23表

我正在用Lisp编写一个web服务器来处理HTTPS请求。我遵循并已经完成了握手过程。我选择的密码套件是TLS\u RSA\u和RC4\u 128\u SHA。我已经计算了客户端写入MAC密钥、服务器写入MAC密钥、客户端写入密钥、服务器写入密钥。这些密钥似乎是正确的,因为我可以解密来自浏览器的“完成”消息并验证其中的数据。我还验证了记录层的HMAC。然后我从服务器发送“更改密码规范”和“完成”。到目前为止,一切似乎都很顺利

然后,我从浏览器中收到了以
#(23 3 3 1 61…
开头的消息<代码>23表示它是一个应用程序数据<代码>#(3)表示TLS 1.2
#(161)
表示长度为256+61=317,这是正确的,因为留下的数据实际上是317字节长。我的问题来了:我使用“客户端写入密钥”用RC4解密了这317个字节,然后得到了类似于
#(148 104 81 182 67 111 28 201 202 50 207 57 126 209 19…)的数据,这些数据无法转换为文本。我想我应该得到类似于
get/HTTP/1.1
的东西。我错了什么


谢谢。

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


因此,您解密的第一条记录是已完成的消息,您解密的第一条应用程序数据应为RC4状态,与解密完成的消息后的状态相同。

您应使用服务器写入密钥而不是客户端写入密钥进行解密。@GregS感谢您的回复。为什么使用服务器写入密钥?根据,服务器写入密钥:用于加密服务器写入的数据的密钥。@GregS我尝试了服务器写入密钥,但没有成功:(我的错,我错过了你在写服务器,我以为你在写客户端。是的,你需要用客户端写密钥解密。对不起,我不知道问题出在哪里。@GregS你是天才!这就是我重置状态的问题。非常感谢你!