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

4

1 回答 1

1

客户端密钥交换将包含:

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

我已经在 J​​ava 中实现了 TLS,并且我遵循相同的结构并且对我来说工作得很好。

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

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

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

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

于 2013-08-31T11:09:21.413 回答