【问题标题】:Pre-master secret mistmatched when implementing Diffie-Hellman key exchange实施 Diffie-Hellman 密钥交换时预主密钥不匹配
【发布时间】:2012-09-07 12:33:59
【问题描述】:

我正在尝试将 DHE_DSS 实现到 go 的 crypto/tls 包中。不幸的是,我似乎无法让 PreMasterSecret (Z) 相同,我的基本工作流程是:

接收服务器密钥交换消息

  • 提取 P、G、Ys
  • 使用提供的数字签名进行验证

准备客户端密钥交换消息

  • 创建客户的 Xc
  • 生成 Yc (Yc = G^Xc % P)
  • 生成 Z (Z = Ys^Xc % P)
  • 寄回 Yc,包装如下:
ckx := make([]byte, len(yC)+2)
ckx[0] = byte(len(Yc)>>8)
ckx[1] = byte(len(Yc))
copy(ckx[2:], yBytes)

但是,当我使用 gnutls-serv 调试它时,两个 PreMasterSecrets (Z) 是不同的。我是否需要在退回的 Yc 上签名,或者以其他方式打包?我在RFC 5246 中看不到任何建议。

这是我的更改补丁:

https://08766345559465695203.googlegroups.com/attach/48587532c74b4348/crypto.patch?part=4&view=1&vt=ANaJVrHbwydqEZc3zjUWqQ5C8Q5zEkWXZLdL0w6JJG3HYntOlBurUTY7mc9xR9OTfE0bJxs4eeL5a5SGd2jj9eIfXcwJQgLvJchXOgkYKBBynbPfshY8kuQ

【问题讨论】:

  • 作为提示,Wireshark 的最新版本(1.8 及更高版本)将解析客户端和服务器密钥交换消息,这将有助于调试。
  • @Jumbogram 可能有点棘手,但它确实可以解析 SSL。
  • 你能给我们看一些代码吗?我有一种感觉,这将是一个“多眼”问题。
  • 是的,如果你能做一个 SSCCE 真的很有帮助:sscce.org
  • 你确定你使用原始根模 N 作为 G 吗?en.wikipedia.org/wiki/Primitive_root_modulo_n

标签: ssl cryptography go diffie-hellman


【解决方案1】:

客户端密钥交换将包含:

length (2 bytes) --> Y_C (in plain text)

我已经在 J​​ava 中实现了 TLS,并且我遵循相同的结构并且工作正常。

我需要在退回的 Yc 上签名吗?

不需要签署客户端DH公有值,以明文形式传输。

您可以使用 pcap 并检查数据包中是否正在传输相同的值。此外,如果 GNU TLS 具有用于打印接收到的Y_C 的记录器,那么您可以检查是否接收到正确的数据。

如果你仍然得到不同的 Pre-Master secret,那么似乎秘钥的生成逻辑有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2023-03-03
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多