抓取的 TLS 加密报文拿到第三方电脑上有办法解密吗?公钥私钥都有

282 天前
 kelaoli
看到流行的解法基本都是自身作为通信的一方直接抓包,通过拿到的密钥在 wireshark 里是可以解密的。现在的问题是如果拿到已经抓好的 RSA 加密包,一对密钥都有,能否对其解密呢?请大佬指教。
1675 次点击
所在节点    SSL
16 条回复
tool2d
282 天前
我试过用 chrome 实时导出 SSLKEYLOGFILE 密钥文件,然后正常抓包。过后,用 wireshark 命令行参数(tshark 的 tls.keylog_file),可以读取这个文件,并且后期解密到明文。

但这文件里,并不是完全是密钥,主要是 masterkey 。

/t/922534
neilp
282 天前
大概率不行. 当今 tls 协议中, RSA 的加密方式已经废弃. 所以无论 RSA 证书还是 ECC 证书, 都只负责签名.
Dh/ECdh 负责交换对称密钥. AES 负责加密.
所以要想解密, 必须要有 SSLKEYLOGFILE . 来获得 AES 的密钥.
楼上说的 wireshark 解密, 是我知道的可能唯一的方式. 你只有证书和私钥没用.
yumusb
282 天前
只有密钥不行
billlee
282 天前
现在的 TLS 密钥交换都是前向保密的,要中间人攻击才行。
iX8NEGGn
282 天前
不行,密钥协商时,两端临时使用的参数,只保存在内存中,交换参数计算得到主密钥后就销毁了,这玩意叫完美向前安全
kelaoli
282 天前
谢谢各位大佬,我在信息安全面前感受到了自己的无知。
我想实现的功能是,通信双方的完整交互报文都拿到了,要在第三台机器上将 TLS 解密。
不懂 TLS ,大概了解了下密钥是由双方生成的随机数和 pre-master-key 组成,两边的随机数虽然会变,但开始交互随机数的时候报文还是未加密的,我理解是可以拿到,就是这个 master key 不知道怎么理解?是公钥还是私钥呢,还是说对通信双方来说正好是反的。
大神们说了很多,我还是没理解,为啥在本机上有办法可以直接抓解密后的包,到了另一台机器上就解不了?这里的区别还是没弄懂。请大佬不吝赐教。
iX8NEGGn
282 天前
我简单的介绍下“DH 密钥协商算法”,想了解更多可以搜索这个关键字。

算法步骤:

步骤 1 )发送方和接收方协商一个大质数 p 和 p 的一个原根 g ;

步骤 2 )发送方秘密选择一个大随机整数 a ,计算 A = ga % p ,公开发送 A 给接收方;

步骤 3 )接收方秘密选择一个大随机整数 b ,计算 B = gb % p ,公开发送 B 给发送方;

步骤 4 )双方计算出密钥

​ 发送方:Sa = Ba % p = (gb % p)a % p = gab % p ;

​ 接收方:Sb = Ab % p = (ga % p)b % p = gab % p ;

​ 可知:K = Sa = Sb ;

知道 p 、g 、A 、B 不能计算出密钥 K ,除非还至少知道 a 或 b 其中一个,a 、b 并不发送给对方,只保存在各自内存中,协商出 K 后就销毁了。

也就是,虽然开始的大质数和原根 p 、g 以及随机数 A 、B 都未加密,但是算不出 K 。

实例:

假如 p = 23 ,g = 5

发送方选取的秘密数字 a = 6 , 那么 A = 56 % 23 = 8 , 将 A 发送给接收方

接收方选取的秘密数字 b = 15 ,那么 B = 515 % 23 = 19 ,将 B 发送给发送方

发送方计算出的密钥 Sa = 196 % 23 = 2

接收方计算出的密钥 Sb = 815 % 23 = 2
iX8NEGGn
282 天前
不好意思,公式里面里包含 markdown 语法,回复纯文本导致格式丢失了,我用截图重写发下:

https://i2.100024.xyz/2024/02/01/1stnh.webp
iX8NEGGn
282 天前
“两边的随机数虽然会变,但开始交互随机数的时候报文还是未加密的,我理解是可以拿到”
随机数就上面说的 a 、b ,你拿不到。

“就是这个 master key 不知道怎么理解?是公钥还是私钥呢”
既不是公钥也不是私钥,公钥和私钥是为了确保上面说的公开参数 p 、g 、A 、B 被中间人两边冒充。
上面说的 K 便是 “pre-master-key (预主密钥)”,然后由预主密钥经过一系列变化得到“master key (主密钥)”。

“本机上有办法可以直接抓解密后的包,到了另一台机器上就解不了”
本机抓包就是交换公开参数 p 、g 、A 、B 时,中间人两边冒充是对方把 A 和 B 都替换掉。也就是对客户端替换掉服务端发来的 B ,自己和客户端协商了一个预主密钥。对服务端替换掉客户端发来的 A ,自己和服务端协商了另一个预主密钥。中间人拿着两个预主密钥分别和两端通信,但两端都误以为是和真正的对方通信。
kelaoli
281 天前
@iX8NEGGn 感谢大佬深入浅出的讲解,既解答了我的疑惑,又让我顺便学到了 MitM 攻击是怎么回事,拜服大佬!
kelaoli
281 天前
@iX8NEGGn 现在明白了,抓的包里面其实是 A 和 B ,并不是关键的随机数 a 和 b ,真的妙!向大神欧拉致敬!
julyclyde
281 天前
@neilp 是“已废弃”吗?
似乎是从来没有过吧
iX8NEGGn
281 天前
#11 ,理解正确。

不过我有一句话少打了一个“不”字,应该是:“公钥和私钥是为了确保上面说的公开参数 p 、g 、A 、B 不被中间人两边冒充。(使用私钥、公钥对它们进行签名和验签)”。

以及信任本机本地证书后,中间人欺骗两端替换掉 A 、B 时,可以选择替换成同一个数,这样两个预主密钥就是相同的,只有一个预主密钥。
neilp
281 天前
@julyclyde
早期有支持 用 RSA 作为密钥交换算法. 用 服务端的 RSA 公钥加密 对称密钥. wireshark 中最初的解密 ssl 流量就支持 RSA. 后来被废弃了. 都用 dh/ecdh 了.
julyclyde
281 天前
@neilp 哪个版本是用 RSA 交换对称密钥啊??
neilp
281 天前
@julyclyde 那个版本真记不得. 我曾经解密过.

这个页面下:
https://www.openssl.org/docs/man1.1.1/man1/ciphers.html

参照这一段:

kRSA, aRSA, RSA
Cipher suites using RSA key exchange or authentication. RSA is an alias for kRSA.

其他的自行谷歌吧.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013170

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX