Quiero implementar un Acuerdo de clave ECC con una curva de Brainpool brainpoolP512r1 o brainpoolP512t1.
No tengo claro qué valor de semilla usar (y cómo). En este documento enlace se mencionan dos valores semilla.
Y RFC enlace
5.1 Generación de números primos
6636920D871574E69A458FEA3F4933D7E0D95748 para ECC 512
5.2 Generación de curvas pseudoaleatorias
02AC60ACC93ED874422A52ECB238FEEE5AB6AD para ECC 512
- Entonces, ¿qué semilla debo usar en el constructor ECDomainParameters?
- ¿El valor de semilla para la curva torcida es el mismo? Solo encuentro valores semilla para brainpool P512r1 y no para brainpoolP512t1
-
¿Está la implementación correcta?
// 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."); } }
¡Muchas gracias!
Daniel