V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kelaoli
V2EX  ›  SSL

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

  •  
  •   kelaoli · 86 天前 · 1147 次点击
    这是一个创建于 86 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看到流行的解法基本都是自身作为通信的一方直接抓包,通过拿到的密钥在 wireshark 里是可以解密的。现在的问题是如果拿到已经抓好的 RSA 加密包,一对密钥都有,能否对其解密呢?请大佬指教。
    16 条回复    2024-02-01 23:28:58 +08:00
    tool2d
        1
    tool2d  
       86 天前
    我试过用 chrome 实时导出 SSLKEYLOGFILE 密钥文件,然后正常抓包。过后,用 wireshark 命令行参数(tshark 的 tls.keylog_file),可以读取这个文件,并且后期解密到明文。

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

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

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

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

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

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

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

    其他的自行谷歌吧.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2798 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:44 · PVG 14:44 · LAX 23:44 · JFK 02:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.