web-dev-qa-db-ja.com

ECCブレインプール標準曲線とBouncy Castleを使用した曲線生成で使用するシードは?

ブレインプールカーブbrainpoolP512r1またはbrainpoolP512t1とのECC鍵契約を実装したい.

使用するシード値(および方法)については不明です。このドキュメントでは http://www.ecc-brainpool.org/download/Domain-parameters.pdf には2つのシード値が記載されています。

そしてRFC http://www.ietf.org/rfc/rfc5639.txt

5.1素数の生成

ECC 512の6636920D871574E69A458FEA3F4933D7E0D95748

5.2疑似ランダム曲線の生成

02AC60ACC93ED874422A52ECB238FEEE5AB6AD for ECC 512

  • ECDomainParametersコンストラクターでどのシードを使用する必要がありますか?
  • ねじれた曲線のシード値は同じですか? brainpoolP512r1のシード値のみが見つかり、brainpoolP512t1のは見つかりません
  • 実装は厳格ですか?

        // ECC 512 = AES 256 = RSA 15360
        var ecP = TeleTrusTNamedCurves.GetByName("brainpoolp512t1");
    
        // because ecP.GetSeed() is null !?
        // see spec "ECC Brainpool Standard Curves and Curve Generation" site 7
    
        // 5.1 Generation of prime numbers
        var seed_p_512PrimeNumbers = StringToByteArray("6636920D871574E69A458FEA3F4933D7E0D95748");
        // 5.2 Generation of pseudo-random curves
        var seed_p_512PseudoRandomCurves = StringToByteArray("02AC60ACC93ED874422A52ECB238FEEE5AB6AD");
    
        var ecSpec = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, seed_p_512PseudoRandomCurves);
    
        // Alice
    
        var enc = new UTF8Encoding();
        var secretPlain = "This is a secret.";
        var secretPlainBytes = enc.GetBytes(secretPlain);
    
    
        IAsymmetricCipherKeyPairGenerator aliceGenerator = GeneratorUtilities.GetKeyPairGenerator("ECDH");
        aliceGenerator.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));
        AsymmetricCipherKeyPair aliceKeyPair = aliceGenerator.GenerateKeyPair();
        IBasicAgreement aliceBasicAgreement = AgreementUtilities.GetBasicAgreement("ECDH");
        aliceBasicAgreement.Init(aliceKeyPair.Private);
    
    
        // Bob
    
        IAsymmetricCipherKeyPairGenerator bobGenerator = GeneratorUtilities.GetKeyPairGenerator("ECDH");
        bobGenerator.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));
        AsymmetricCipherKeyPair bobKeyPair = bobGenerator.GenerateKeyPair();
        IBasicAgreement bobBasicAgreement = AgreementUtilities.GetBasicAgreement("ECDH");
        bobBasicAgreement.Init(bobKeyPair.Private);
    
    
        // generate shared key
    
        var k1 = bobBasicAgreement.CalculateAgreement(aliceKeyPair.Public).ToByteArray();
        var k2 = aliceBasicAgreement.CalculateAgreement(bobKeyPair.Public).ToByteArray();
    
        for (int i = 0; i < k1.Length; i++)
        {
            if (k1[i] != k2[i])
            {
                throw new Exception("Secrets are not equal.");
            }
        }
    

どうもありがとう!

ダニエル

1
dhcgn

シードを指定する必要はまったくありません。

楕円曲線は、いくつかのパラメーターによって指定されます。

  • 再生しているフィールドの定義(ここでは、フィールドは与えられた素数を法とする整数で構成されますp);
  • 曲線方程式、ここではY2 = X + aX + b 2つの定数aおよびbの場合;
  • 従来のジェネレータ[〜#〜] g [〜#〜]、これはカーブポイントです(つまり、座標のペア(X、Y)カーブ方程式と一致します);
  • ジェネレータの次数nとその補因子h

次数nは、nG =;のような最小の非ゼロ整数です。 hは、曲線内のポイントの総数がnhと等しくなるようにします。通常、nが素数でh = 1になるような曲線を選択します。つまり、ジェネレーターは曲線全体を生成し、Diffie-HellmanまたはDSAに適した素数次数を使用します。 。

は、曲線で物事を計算するためにまったく必要ありません。シードは生成曲線自体に使用されました。 " nothing-up-my-sleeve numbers "についてです。隠し構造(paおよびbの表記)を持つ特別なパラメーターを生成することは数学的に可能です(または少なくとも可能性があります)上記のように、曲線looksは良好ですが、実際には暗号解読には弱いです通常の正直な曲線の生成は次のようになります。完全にランダムなpaおよびbを生成し、次に RFC 5639のセクション2 ;それらがすべて満たされていない場合は、再試行してください。弱点を引き起こす特殊な形式のパラメータは非常にまれであるため、ランダムな生成で問題ありません。

demonstrateに、この通常のプロセスが実行されたこと、したがって、曲線パラメーターが特に弱く作成されていないこと、すべてを生成するために使用されるPRNGを完全に指定することが慣例ですランダムな値、その開始シードで完了します。したがって、サードパーティ(たとえば、あなた)はPRNGと曲線生成プロセスを再実行し、実際に同じ曲線パラメータを取得していることを確認できます。ブレインプールカーブの場合、このPRNGは 付録A で指定されます。ここでは、最初にpを生成し、次にaおよびbを生成するため、それらには2つの異なるシードとしてtwoシードがあります。それぞれ独自のシードを持つステップ。

ただし、その必要はありません毎回。このような曲線の再生成を行う場合は、RFCで見つかったパラメーターが正当であることを確認するためにonceを行います。実際、自分で行う必要はありません。誰かがどこかでそれを実行したことを自分に納得させる必要があります。いずれにしても、使用しようとしているカーブパラメータはすでにBouncy Castleにあります。

se曲線のみの場合、シードは不要であり、nullに設定できます。 ECDomainParametersクラスにはseedを指定する余地があります。これは、曲線パラメーターをエンコードするための一部の(すべてではない)標準が、そのようなシードをサポートするための規定があるためです。ただし、これは実際にはあなたのケースには当てはまりません:

  • コードはコードと通信します。したがって、どちらのパーティもすでに使用されているカーブを認識しており、カーブパラメータをどこにもエンコードする必要はまったくありません。
  • パラメータをエンコードしたとしても、各パーティはピアから送信されたパラメータではなく、独自のハードコードされたパラメータを使用するため、カーブ生成プロセスを再実行する必要はありません。
  • いずれにしても、パラメータ生成PRNGの標準はありません。 Brainpoolには独自の機能がありますが、全員に適合する合意済みのPRNGはありません(DSAパラメータとは逆に、 標準自体 に含まれています。付録Aを参照)。実際、これは、Brainpoolプロセスが1つではなく2つのシードを使用するという事実に見ることができます。

したがって、現時点では、エンコードされたパラメーターとseedクラスにECDomainParametersを含めることは、純粋な重荷です。それをnullに設定して次に進んでください。


私はBouncy Castle C#APIの実践者ではないので、実際の使用についてコメントすることはできませんが、ざっくりとした見た目から、問題はないようです。あなたのsecretPlainBytes変数は偽のようです。これは、表示されていないコードを使用して、合意された鍵(DH鍵交換の結果)で暗号化するメッセージだと思います。

3
Tom Leek