2012-02-01 40 views
0

Diffie-Hellmanキー交換を実行するために弾力のあるキャッスル.netライブラリを使用しようとしていて、DHParamsオブジェクトを生成するときに問題が発生しています。Bouncy Castle Diffie-Hellman DHParams Issue

私のソリューションには、接続するクライアントごとに別個のDHキー/ペアを生成する中央権限が含まれます。アイデアは、私が接続する各クライアントのために別個のDH鍵契約を保持することです。次に、p、g値をクライアントに送信します。ここで、クライアントはdh鍵合意を計算します。私は、各クライアントごとに異なる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コンストラクタの確実性のために異なる値を返します。上向きに5秒の他のプロセスが実行されていないとのデュアルコア2.1GHzのプロセッサ上で -

 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ビットの素数を生成するために時間がかかりすぎるということです。

は、ここに私のコードです。これは、接続を開始する各クライアントで発生するペナルティの大きさが大きすぎます。私はBigIntegerのビット長を小さくしたいと思います。

私はおそらくこれを完全に間違っていると思います - 弾力のある城でDHを行う方法はほとんどなく、テスト/サンプルはちょうど私の使用例とは一致しません。私は、事前に生成されたp、g値を持つことは望ましくありません。

EDIT 768ビットの長さでも、しばらくの間エラーが発生するようです。私のマシンを再起動した後は、動作する1024ビット以外のビット長を得ることができませんでした。私は何か間違っていると思う。

答えて

2

私はそれを理解しました。 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 
関連する問題