在执行Diffie-Hellman密钥交换时,预主秘密不匹配

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

接收服务器密钥交换消息

  • 提取P,G,Ys
  • 使用提供的数字签名进行validation

准备客户端密钥交换消息

  • 创build客户端的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-servdebugging这两个PreMasterSecrets(Z)是不同的。 我是否需要签署退回的Yc,或者以另一种方式包装? 我不能在RFC 5246中看到任何build议。

< – 编辑 – >

这是我的一些修改:

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

客户端密钥交换将包含:

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

我已经在Java中实现了TLS,并遵循相同的结构,对我来说工作正常。

我需要签署退回Yc吗?

没有必要签署客户端的DH公共价值 ,它是以纯文本格式转移。

您可以采取pcap并检查相同的值是否在数据包中传输。 另外,如果GNU TLS具有打印接收到的Y_Clogging器,则可以检查是否正在接收正确的数据。

如果你仍然得到不同的前主秘密,那么秘密生成的逻辑似乎有一些问题。