php – 如何解密HTTPS(ECDHE)数据?
|
我试图了解HTTPS的确切工作原理并进行一些实际测试. 我有一个从TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA加密的HTTPS通信中捕获的数据. 如果我理解正确,客户端在TLS握手期间会创建一个主密钥,然后使用服务器的公钥对其进行加密并发送到服务器.然后将该主密钥(作为纯文本)用作加密正在进行的通信的对称密钥.它是否正确? 如果是,如果我知道主密钥,如何解密数据? 起初对我来说听起来很容易,所以我写了这个脚本 $masterKey = '8ef36f0eb2c10ea6142693374f6c5c7ae65eee5f6bd45bd1990b08e6c144227382726496b795d62284bd8c6c0cadbbdb';
$someRandomEncryptedData = '170303001D314A69C7DF95E07AAF51FBDA01C178D45330BC902308DF8C418FA5B02B';
$sDecrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256,pack('H*',$masterKey),$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或Elliptic Curve Diffie-Hellman的共同秘密. 他们使用premaster_secret,随机添加客户端,随机添加服务器,然后到达master_secret.然后他们接受master_secret并从中导出6个对称密钥: >客户初始IV 这些键用于键入块或流密码. 如果你注意到,每一方都对premaster_secret做出贡献 – 客户贡献g ^ a,服务器贡献g ^ b.然后每一方通过nonce贡献master_secret – 客户端随机和服务器随机. 双方有两个贡献的原因是传输方案,如RSA密钥传输,不允许服务器贡献给premaster_secret.服务器必须等到master_secret的派生才通过nonce贡献给密钥材料. 所以进展是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字节是伪随机函数(PRF)的输出.查看RFC 5246,第13页. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
