如何解密HTTPS(ECDHE)数据?

How to decrypt HTTPS (ECDHE) data?

我正在尝试了解 HTTPS 的具体工作原理并进行一些实际测试。

我有一个从 HTTPS 通信捕获的数据,由 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 加密。

如果我没理解错的话,客户端在 TLS 握手期间创建了一个主密钥,然后使用服务器的 public 密钥对其进行加密并发送到服务器。这个主密钥(作为纯文本)然后用作对称密钥来加密正在进行的通信。这是正确的吗?

如果是,如果我知道主密钥,如何解密数据?

起初我觉得很容易,所以我就写了这个脚本

$masterKey = '8ef36f0eb2c10ea6142693374f6c5c7ae65eee5f6bd45bd1990b08e6c144227382726496b795d62284bd8c6c0cadbbdb';

$someRandomEncryptedData = '170303001D314A69C7DF95E07AAF51FBDA01C178D45330BC902308DF8C418FA5B02B';

$sDecrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, pack('H*', $masterKey), pack('H*', $someRandomEncryptedData), MCRYPT_MODE_CBC);

echo $sDecrypted;

然后我注意到主密钥的长度为 96 字节(二进制字符串为 48),这导致 PHP 警告,因为密钥的长度应为 256 位(32 字节)。我错过了什么吗?

client during the request creates a master key, which is then encrypted using server's public key and sent to server. This master key (as a plain text) is then used as a symmetric key for encrypting ongoing communication. Is this correct?

嗯,总而言之,没有。

因为你问的是DH和ECDH,它们是Key Agreement协议:客户端not生成随机密钥,加密它在服务器的 public 密钥下,然后将其发送到服务器。这是密钥传输(如 RSA 密钥传输),不是 DH 或 ECDH。密钥传输将在 TLS 1.3 中消失。

TLS 有两个阶段:密钥协商和批量传输。这些阶段不像在 IPSec 中那样明确定义。当客户端和服务器使用 DH 或 ECDH 时,它们到达 premaster_secret。这是 Diffie-Hellman 或椭圆曲线 Diffie-Hellman 的共享秘密。

他们取 premaster_secret,他们随机添加一个客户端,随机添加一个服务器,然后到达 master_secret。然后他们取 master_secret 并从中导出 6 个对称密钥:

  • 客户初始 IV
  • 客户端加密密钥
  • 客户端mac密钥
  • 服务器初始 IV
  • 服务器加密密钥
  • 服务器mac键

这些密钥用于加密块或流密码。

如果您注意到,每一方都贡献 premaster_secret - 客户端贡献 g^a,服务器贡献 g^b。然后每一方都通过 nonces 为 master_secret 做出贡献 - 客户端随机和服务器随机。

双方有两个贡献的原因是传输方案,如 RSA 密钥传输,不允许服务器对 premaster_secret 做出贡献。服务器必须等到推导 master_secret 才能通过随机数贡献密钥 material。

所以进展是 premaster_secretmaster_secret 到 6 个会话密钥。我不确定主密钥在哪里...


If yes, how to decrypt the data, if I know the master key?

我认为如果您有主密钥,将它插入 Wireshark 通常会更容易。 Wireshark wiki 讨论了一个主密钥(虽然我不知道它是什么 - 有一个 premaster_secretmaster_secret)。请参阅 Secure Socket Layer (SSL).

的 Wireshark wiki

It sounded pretty easy to me at first, so I just wrote this script

是的... :) 查看 RFC 5246。那是 Transport Layer Security (TLS) Protocol Version 1.2。然后说简单的:)


Then I notice that master key is 96 byte long (48 as binary string)

96 字节是伪随机函数 (PRF) 的输出。查看 RFC 5246,第 13 页。