我试图了解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字节)长。我错过了什么吗?
答案 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个对称密钥:
这些键用于键入块或流密码。
如果您注意到,每方支持premaster_secret
- 客户提供g^a
且服务器提供g^b
。然后每一方通过nonce贡献master_secret
- 客户端随机和服务器随机。
双方有两个贡献的原因是传输方案,如RSA密钥传输,不允许服务器为premaster_secret
做出贡献。服务器必须等到导出master_secret
才能通过随机数提供密钥材料。
因此,进展为premaster_secret
到master_secret
到6个会话密钥。我不确定万能钥匙在哪里......
如果是,如果我知道主密钥,如何解密数据?
如果您拥有主密钥,我认为通常更容易将其插入Wireshark。 Wireshark wiki谈到了一个万能钥匙(虽然我不知道它是什么 - 那里有一个premaster_secret
和master_secret
)。请参阅Wireshark wiki了解Secure Socket Layer (SSL)。
起初对我来说听起来很容易,所以我只写了这个脚本
是啊...... :)查看RFC 5246.那是Transport Layer Security (TLS) Protocol Version 1.2。然后让我们谈谈简单:)
然后我注意到主密钥长度为96字节(48为二进制字符串)
96字节是伪随机函数(PRF)的输出。查看RFC 5246,第13页。