实现Diffie-Hellman密钥交换时,预主密钥不匹配

时间:2012-09-14 10:43:28

标签: ssl cryptography go diffie-hellman

我正在尝试将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 个答案:

答案 0 :(得分:1)

客户密钥交换将包含:

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

我已经用Java实现了TLS,我遵循相同的结构,对我来说很好。

  

我是否需要签署退回的Yc?

无需签署客户端DH公共值,它以纯文本格式传输。

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

如果你仍然得到不同的Pre-Master秘密,那么生成秘密的逻辑似乎存在一些问题。