实施Diffie-Hellman密钥交换时,Pre-master secret不匹配

42

我正在尝试将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


1
提醒一下,最近版本的Wireshark(1.8及以上)将解析客户端和服务器密钥交换消息,这应该有助于调试。 - Jumbogram
1
你能展示给我们一些代码吗?我有一种感觉,这将成为一个“众筹”问题。 - Intermernet
1
是的,如果您能制作一个SSCCE(http://sscce.org/),那将非常有帮助。 - David Grayson
1
你确定你在模N下使用了原根G吗?http://zh.wikipedia.org/wiki/原根 - Tizianoreica
已将补丁添加到问题中。 - jawr
显示剩余8条评论
1个回答

1
客户端密钥交换将包含:
length (2 bytes) --> Y_C (in plain text)

我已经在Java中实现了TLS,我遵循相同的结构,它对我来说运行良好。
需要签署返回的Yc吗?
不需要签署客户端DH公共值,它是以明文传输的。
您可以获取pcap并检查是否在数据包中传输了相同的值。此外,如果GNU TLS具有用于打印接收到的 Y_C 的记录器,则可以检查是否正在接收正确的数据。
如果仍然获得不同的Pre-Master密钥,则生成密钥的逻辑存在问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接