如何解密HTTPS(ECDHE)数据?

时间:2015-01-05 03:38:38

标签: php encryption https elliptic-curve diffie-hellman

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

1 个答案:

答案 0 :(得分:3)

  请求期间

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

嗯,总而言之,没有。

因为您询问DH和ECDH,这是密钥协议协议:客户端 生成随机密钥,在服务器下对其进行加密公钥然后将其发送到服务器。该密钥传输(如RSA密钥传输)和 DH或ECDH。密钥传输在TLS 1.3中消失。

TLS有两个阶段:密钥协议和批量转移。这些阶段的定义不如IPSec中的定义。当客户端和服务器使用DH或ECDH时,它们到达premaster_secret。这是共享秘密从Diffie-Hellman或Elliptic Curve Diffie-Hellman中消失。

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

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

这些键用于键入块或流密码。

如果您注意到,每方支持premaster_secret - 客户提供g^a且服务器提供g^b。然后每一方通过nonce贡献master_secret - 客户端随机和服务器随机。

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

因此,进展为premaster_secretmaster_secret到6个会话密钥。我不确定万能钥匙在哪里......


  

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

如果您拥有主密钥,我认为通常更容易将其插入Wireshark。 Wireshark wiki谈到了一个万能钥匙(虽然我不知道它是什么 - 那里有一个premaster_secretmaster_secret)。请参阅Wireshark wiki了解Secure Socket Layer (SSL)


  

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

是啊...... :)查看RFC 5246.那是Transport Layer Security (TLS) Protocol Version 1.2。然后让我们谈谈简单:)


  

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

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