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 でデバッグすると、2 つの PreMasterSecret (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)

Java で TLS を実装しましたが、同じ構造に従っており、問題なく動作します。

返された Yc に署名する必要がありますか?

いいえ、クライアント DH パブリック値に署名する必要は。プレーン テキストで転送されます。

pcap を取得して、同じ値がパケットで転送されているかどうかを確認できます。また、GNU TLS に受信したデータを出力するためのロガーがあるY_C場合は、適切なデータが受信されているかどうかを確認できます。

それでも異なるプレマスター シークレットを取得する場合は、シークレットの生成ロジックに問題があるようです。

于 2013-08-31T11:09:21.413 に答える