We have a number of possible types of elliptic curve methods. These have a field (the prime number used), the order (the number of elliptic curve points), an \(a\) value, a \(b\) value, and a generator point (\(G\)). For a Weierstrass curve the standard form is \(y^2=x^3+ax+b\). With a twisted Edwards curve (such as Ed25519) we have the form of \(ax^2+y^2=1+dx^2y^2\). A Montgomory curve has the form of \(by^2=x^3+ax^2+x\).
FIPS EC Curve Types using Bouncy Castle and C# |
Code
First we create a folder named "bc_ec01", and then go into that folder.We can create a Dotnet console project for .NET 8.0 with:
dotnet new console --framework net8.0
Next some code:
namespace ECMethods { using Org.BouncyCastle.Asn1.X9; using Org.BouncyCastle.Crypto.Asymmetric; class Program { static void Main(string[] args) { var curvename="brainpoolp160r1"; if (args.Length >0) curvename=args[0]; try { X9ECParameters ecParams = ECNamedCurveTable.GetByName(curvename); var n= new ECDomainParameters(ecParams.Curve, ecParams.G, ecParams.N, ecParams.H, ecParams.GetSeed() ); Console.WriteLine("Type: {0}",curvename); Console.WriteLine("\nG={0},{1}",ecParams.G.AffineXCoord,ecParams.G.AffineYCoord); Console.WriteLine("N (order)={0}",ecParams.N); Console.WriteLine("H ={0}",ecParams.H); Console.WriteLine("A ={0}\nB={1}\nField size={2}",ecParams.Curve.A,ecParams.Curve.B,ecParams.Curve.FieldSize); } catch (Exception e) { Console.WriteLine("Error: {0}",e.Message); } } } }
A sample run gives:
Type: P-256 G=6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296, 4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5 N (order)=115792089210356248762697446949407573529996955224135760342422259061068512044369 H=1 A=ffffffff00000001000000000000000000000000fffffffffffffffffffffffc B=5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b Field size=256 DER=3081F7020101302C06072A8648CE3D0101022100FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF305B0420FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC04205AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B031500C49D360886E704936A6678E1139D26B7819F7E900441046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5022100FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551020101
and:
Type: secp256k1 G=79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798, 483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 N (order)=115792089237316195423570985008687907852837564279074904382605163141518161494337 H=1 A=0 B=7 Field size=256 DER=3081E0020101302C06072A8648CE3D0101022100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F3044042000000000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000000704410479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8022100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141020101
DER is a binary format which defines the curve. If we convert we get [here]:
DER: 3081E0020101302C06072A8648CE3D0101022100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F3044042000000000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000000704410479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8022100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141020101 [U] SEQUENCE (30) [U] INTEGER (02): 1 [U] SEQUENCE (30) [U] OBJECT (06): 1.2.840.10045.1.1 [U] INTEGER (02): 115792089237316195423570985008687907853269984665640564039457584007908834671663 [U] SEQUENCE (30) [U] OCTET STRING: 0xb'0000000000000000000000000000000000000000000000000000000000000000' Private key: 0000000000000000000000000000000000000000000000000000000000000000 [U] OCTET STRING: 0xb'0000000000000000000000000000000000000000000000000000000000000007' Private key: 0000000000000000000000000000000000000000000000000000000000000007 [U] OCTET STRING: 0xb'0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8' Private key: 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 [U] INTEGER (02): 115792089237316195423570985008687907852837564279074904382605163141518161494337 [U] INTEGER (02): 1