【问题标题】:How to decrypt data at Application Layer of HTTPS?如何在 HTTPS 的应用层解密数据?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多