c# アプリケーションで ECDH (p521 曲線) を使用して共有キーを生成するために、bouncycastle ライブラリを使用しようとしています。
Microsoft の CngKey を使用しましたが、サーバーとクライアントで生成される共有キーは同じです。ただし、これは Win XP ではサポートされていないため、Bouncycastle を試しています。
以下は、キーペアを生成し、サーバーの X と Y を取得して、そこからサーバーの公開キーを生成するコードです。
X9ECParameters ecP = NistNamedCurves.GetByName("P-521");
ECDomainParameters ecSpec = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
IAsymmetricCipherKeyPairGenerator g = GeneratorUtilities.GetKeyPairGenerator("ECDH");
g.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));
// Client X and Y
BigInteger ax = ecP.G.X.ToBigInteger();
byte[] axb = ax.ToByteArray();
BigInteger ay = ecP.G.Y.ToBigInteger();
byte[] ayb = ay.ToByteArray();
// Generate Client Keypair
AsymmetricCipherKeyPair aKeyPair = g.GenerateKeyPair();
IBasicAgreement aKeyAgree = AgreementUtilities.GetBasicAgreement("ECDH");
aKeyAgree.Init(aKeyPair.Private);
// Get Servers X and Y
Console.WriteLine("Enter X co-ordinate");
string BobXhex = Console.ReadLine();
Console.WriteLine("Enter Y co-ordinate");
string BobYhex = Console.ReadLine();
// Server public key
FpCurve c = (FpCurve)ecSpec.Curve;
ECFieldElement x = new FpFieldElement(c.Q, new BigInteger(BobXhex, 16));
ECFieldElement y = new FpFieldElement(c.Q, new BigInteger(BobYhex, 16));
ECPoint q = new FpPoint(ecP.Curve, x, y);
ECPublicKeyParameters publicKey = new ECPublicKeyParameters("ECDH", q, SecObjectIdentifiers.SecP521r1);
// generate shared key
BigInteger k1 = aKeyAgree.CalculateAgreement(publicKey);
byte[] genKey = k1.ToByteArray();
上記が共有キーを生成する正しい方法であるかどうかを知りたいと思いました。共有キーがサーバーで生成されたものと一致しません。
ありがとう!