0

弾力のある城の .net ライブラリを使用して Diffie-Hellman 鍵交換を実行しようとしていますが、DHParams オブジェクトを生成するときに問題が発生しています。

私のソリューションには、接続するクライアントごとに個別の DH キー/ペアを生成する中央機関が含まれます。アイデアは、接続するクライアントごとに個別の DH キー アグリーメントを保持するというものです。次に、クライアントが dh 鍵合意を計算するクライアントに p,g 値を送信します。クライアントごとに異なる p,g 値を生成したいと考えています。そのために BigInteger を使用していますが、いくつかの問題が発生しています。

新しい DHParameters オブジェクトを作成しようとすると、768 以外のビット長を使用するたびに次の例外がスローされます。

System.ArgumentException was unhandled
  Message="generator must in the range [2, p - 2]\r\nParameter name: g"
  Source="BouncyCastle.Crypto"
  ParamName="g"
  StackTrace:
       at Org.BouncyCastle.Crypto.Parameters.DHParameters..ctor(BigInteger p, BigInteger g, BigInteger q, Int32 m, Int32 l, BigInteger j, DHValidationParameters validation)
       at Org.BouncyCastle.Crypto.Parameters.DHParameters..ctor(BigInteger p, BigInteger g, BigInteger q, Int32 l)
       at TestDH.Program.Main(String[] args) in C:\dev\source\TestDH\TestDH\Program.cs:line 30
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
  "generator must in the range [2, p - 2]" 

それが問題かどうかはわかりませんが、確実に BigInteger コンストラクターでさまざまな値を試してみました。

これが私のコードです:

        SecureRandom sr = new SecureRandom();

        // p,g generation, done by central authority
        BigInteger g512 = new BigInteger(512, 30, sr);
        BigInteger p512 = new BigInteger(512, 30, sr);

        // p,g is then sent to client from central authority

        // common - performed by both server and client sides
        IAsymmetricCipherKeyPairGenerator keyGen = GeneratorUtilities.GetKeyPairGenerator("DH");
        DHParameters dhParams = new DHParameters(p512, g512, null, 512); // Here is where I get the exception if the first parameter if BigInteger is not 768 or lager

問題は、768 ビットの素数を生成するのに時間がかかりすぎることです。他のプロセスが実行されていないデュアル コア 2.1Ghz プロセッサでは、5 秒以上かかります。これは、接続を開始する各クライアントで発生するペナルティが大きすぎます。BigInteger のビット長を小さくしたいと思います。

私はおそらくこれを完全に間違っています.弾む城でDHを行う方法に関するドキュメントはほとんどなく、テスト/例は私の使用例と一致しません. 事前に生成された p、g 値は必要ありません。

EDIT 768 ビット長でも時々エラーが発生するようです。マシンを再起動した後、1024 以外のビット長を動作させることができず、それでも約 80% の時間しか使用できませんでした。私は何か間違ったことをしていると思います。

4

1 に答える 1

3

私はそれを考え出した。DHParameters にコンストラクターを使用しないでください。ジェネレータ ユーティリティを使用してパラメータを取得します。動作するコードは次のとおりです。

        const int DefaultPrimeProbability = 30;

        DHParametersGenerator generator = new DHParametersGenerator();
        generator.Init(512, DefaultPrimeProbability, new SecureRandom());
        DHParameters parameters = generator.GenerateParameters();

        KeyGenerationParameters kgp = new DHKeyGenerationParameters(new SecureRandom(), parameters);
        keyGen.Init(kgp);

        AsymmetricCipherKeyPair aliceKeyPair = keyGen.GenerateKeyPair();
        IBasicAgreement aliceKeyAgree = AgreementUtilities.GetBasicAgreement("DH");
        aliceKeyAgree.Init(aliceKeyPair.Private);

        AsymmetricCipherKeyPair bobKeyPair = keyGen.GenerateKeyPair();
        IBasicAgreement bobKeyAgree = AgreementUtilities.GetBasicAgreement("DH");
        bobKeyAgree.Init(bobKeyPair.Private);

        BigInteger aliceAgree = aliceKeyAgree.CalculateAgreement(bobKeyPair.Public);
        BigInteger bobAgree = bobKeyAgree.CalculateAgreement(aliceKeyPair.Public);

        if (!aliceAgree.Equals(bobAgree))
        {
            throw new Exception("Keys do not match.");
        }

        // generate key from prime integers generated above
于 2012-02-02T00:44:53.530 に答える