2016-06-29 19 views
0

現在SSHクライアントを開発しており、上記のクライアントがECDH KEX(NIST-256,384および521)を介してサーバーと鍵を交換する必要があります。クラスECDiffieHellmanCngから共有秘密を抽出してください

私はいくつかの(実際には多くの)研究を行い、.NETクラスECDiffieHellmanCngを見つけ、サーバの公開鍵をクラスにインポートしてインポートできました。

しかし、私は共有秘密を引き出すことなくそれを抽出できないという問題があります(ECDiffieHellmanCng.DeriveKeyMaterial(CngKey otherpartyPublicKey))。

共有秘密に直接アクセスする方法はありますか(RFCの論文では「k」と呼ばれています)?

HereはECDH実装のRFCから7ページであると私は必要とする理由の秘密の共有:

交換ハッシュHは 以下の連結のハッシュとして計算されます。

列V_C、クライアントの識別文字列(CRやLFを除く)

列V_S、サーバの識別文字列(CRやLFを除く)

列I_C、クライアントのSSH_MSG_KEXINIT

列のペイロードI_S 、サーバーのSSH_MSG_KEXINITのペイロード

文字列K_S、サーバの公開ホスト鍵

文字列Q_C、クライアントのはかない公開鍵オクテット文字列

文字列Q_S、サーバのはかない公開鍵オクテット文字列

mpint K、秘密の共有< - 私は任意の派生

前に純粋な秘密 を必要とする理由です

ご協力ありがとうございました!

答えて

0

多くの研究の後でさえ、私はそれを行う方法を見つけることができなかったので、答えはいいえ - あなたは秘密を抽出することはできません。

大きな写真の解決策は、ECDiffieHellmanCngクラスをすべて破棄し、C#でOpenSSHライブラリをラップすることでした。

これは、少なくとも同じアイデアを持つ他の人に役立つことを願っています。

1

実際にはkは必要ありません。次に、Hを計算する必要があります。ECDiffieHellmanクラスを使用すると、そのようにすることができます。

byte[] prepend = Concat(V_C, V_S, I_C, I_S, K_S, Q_C, Q_S); 
byte[] exchangeHash = ecdh.DeriveKeyFromHash(otherPublic, new HashAlgorithmName("whatever your hash algorithm is"), prepend, null); 

それは、.NET 4.6.2(現在はプレビューで)APIを使用しているものの:DeriveKeyFromHash

古いフレームワーク上にある場合、それはまだ可能だが、特にECDiffieHellmanCngタイプを使用する必要があります:

ecdhCng.SecretPrepend = prepend; 
ecdhCng.SecretAppend = null; 
ecdhCng.HashAlgorithm = new CngAlgorithm("whatever your hash algorithm is"); 
ecdhCng.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; 
byte[] exchangeHash = ecdhCng.DeriveKeyMaterial(otherPublic); 
+0

返信いただきありがとうございます。 私はそれを試みたが、それは私のためにうまくいかなかった。鍵は予想される長さの鍵を生成するために複数回の派生を必要とすることがあるため、解決策は前置と追加の特定の組み合わせである可能性があります。しかし、彼らの派生についてのMicrosoftのドキュメントは、欠けていたので、私はあまりにもそれを見て気にしなかった。 私はこの問題を持つ他の誰かがもう一度それを試すことができるように答えをupvoteします。 :) – Oachkatzl

関連する問題