脚本宝典收集整理的这篇文章主要介绍了php – 如何解密HTTPS(ECDHE)数据?,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个从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
>客户端加密密钥
>客户端mac密钥
>服务器初始IV
>服务器加密密钥
>服务器mac密钥
这些键用于键入块或流密码.
如果你注意到,每一方都对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.然后让我们谈谈简单:)
以上是脚本宝典为你收集整理的php – 如何解密HTTPS(ECDHE)数据?全部内容,希望文章能够帮你解决php – 如何解密HTTPS(ECDHE)数据?所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。