如何解密HTTPS(ECDHE)数据


How to decrypt HTTPS (ECDHE) data?

我试图了解HTTPS究竟是如何工作的,并做了一些实际的测试。

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

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

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

起初对我来说听起来很容易,所以我只是写了这个脚本

$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 字节)长。我错过了什么吗?

客户端在请求期间创建一个主密钥,然后使用服务器的公钥对其进行加密并发送到服务器。然后,此主密钥(作为纯文本)用作对称密钥,用于加密正在进行的通信。这是对的吗?

好吧,总而言之

,没有。

因为您询问的是DH和ECDH,它们是密钥协议协议:客户端不会生成随机密钥,而是在服务器的公钥下对其进行加密,然后将其发送到服务器。这是密钥传输(如 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。然后每一方通过随机数(客户端随机数和服务器随机数)为master_secret做出贡献。

双方都有两个贡献的原因是传输方案(如 RSA 密钥传输)不允许服务器为premaster_secret做出贡献。服务器必须等到master_secret的派生才能通过随机数为密钥材料做出贡献。

因此,进度premaster_secret master_secret到 6 个会话密钥。我不确定主密钥在哪里...

<小时 />

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

我认为如果你有主密钥,把它插入Wireshark通常更容易。Wireshark 维基谈到了万能钥匙(虽然我不知道它是什么 - 有一个premaster_secretmaster_secret)。请参阅 Wireshark wiki 了解安全套接字层 (SSL)。

<小时 />

起初对我来说听起来很容易,所以我只是写了这个脚本

是...... :)查看 RFC 5246。这是传输层安全性 (TLS) 协议版本 1.2。然后让我们谈谈简单的:)

<小时 />

然后我注意到主密钥的长度为 96 字节(48 字节为二进制字符串)

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