ブレインプールカーブ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
実装は厳格ですか?
// 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.");
}
}
どうもありがとう!
ダニエル
シードを指定する必要はまったくありません。
楕円曲線は、いくつかのパラメーターによって指定されます。
次数nは、nG =;のような最小の非ゼロ整数です。 hは、曲線内のポイントの総数がnhと等しくなるようにします。通常、nが素数でh = 1になるような曲線を選択します。つまり、ジェネレーターは曲線全体を生成し、Diffie-HellmanまたはDSAに適した素数次数を使用します。 。
種は、曲線で物事を計算するためにまったく必要ありません。シードは生成曲線自体に使用されました。 " nothing-up-my-sleeve numbers "についてです。隠し構造(p、aおよびbの表記)を持つ特別なパラメーターを生成することは数学的に可能です(または少なくとも可能性があります)上記のように、曲線looksは良好ですが、実際には暗号解読には弱いです通常の正直な曲線の生成は次のようになります。完全にランダムなp、aおよびbを生成し、次に RFC 5639のセクション2 ;それらがすべて満たされていない場合は、再試行してください。弱点を引き起こす特殊な形式のパラメータは非常にまれであるため、ランダムな生成で問題ありません。
demonstrateに、この通常のプロセスが実行されたこと、したがって、曲線パラメーターが特に弱く作成されていないこと、すべてを生成するために使用されるPRNGを完全に指定することが慣例ですランダムな値、その開始シードで完了します。したがって、サードパーティ(たとえば、あなた)はPRNGと曲線生成プロセスを再実行し、実際に同じ曲線パラメータを取得していることを確認できます。ブレインプールカーブの場合、このPRNGは 付録A で指定されます。ここでは、最初にpを生成し、次にaおよびbを生成するため、それらには2つの異なるシードとしてtwoシードがあります。それぞれ独自のシードを持つステップ。
ただし、その必要はありません毎回。このような曲線の再生成を行う場合は、RFCで見つかったパラメーターが正当であることを確認するためにonceを行います。実際、自分で行う必要はありません。誰かがどこかでそれを実行したことを自分に納得させる必要があります。いずれにしても、使用しようとしているカーブパラメータはすでにBouncy Castleにあります。
se曲線のみの場合、シードは不要であり、null
に設定できます。 ECDomainParameters
クラスにはseed
を指定する余地があります。これは、曲線パラメーターをエンコードするための一部の(すべてではない)標準が、そのようなシードをサポートするための規定があるためです。ただし、これは実際にはあなたのケースには当てはまりません:
したがって、現時点では、エンコードされたパラメーターとseed
クラスにECDomainParameters
を含めることは、純粋な重荷です。それをnull
に設定して次に進んでください。
私はBouncy Castle C#APIの実践者ではないので、実際の使用についてコメントすることはできませんが、ざっくりとした見た目から、問題はないようです。あなたのsecretPlainBytes
変数は偽のようです。これは、表示されていないコードを使用して、合意された鍵(DH鍵交換の結果)で暗号化するメッセージだと思います。