With ECC, we have a base point on the curve (\(G\)) and then create a random value for the private key (\(D\)) and then generate the public key with \(P=D.G\). For the curve types, we have "03" for a Montgomery curve (\(B.y^2 = x^3 + A.x^2 + x \pmod p\)), "01" for a Weierstrass curve (\(y^2 = x^3 + A.x + B \pmod p\)) and "02" for a Twisted Edwards curve (\(A.x^2 + y^2 = 1 + B.x^2.y^2 \pmod p\)).
Generating an ECC key pair in PowerShell |
Method
With ECC, we have a base point on the curve (\(G\)) and then create a random value for the private key (\(D\)) and then generate the public key with \(P=D.G\).
For the curve types, we can have a Montgomery curve:
\(B.y^2 = x^3 + A.x^2 + x \pmod p\)
For a Weierstrass curve:
\(y^2 = x^3 + A.x + B \pmod p\)
For a Twisted Edwards curve:
\(A.x^2 + y^2 = 1 + B.x^2.y^2 \pmod p\)
The coding is:
$curvename=$Args[0] $ecc = [System.Security.Cryptography.ECDsa]::Create([System.Security.Cryptography.ECCurve]::CreateFromFriendlyName(($curvename))) $s=$ecc.ExportExplicitParameters($true) $e=$ecc.ExportParameters($true) "Curve: "+$e.Curve.Oid.FriendlyName "Curve: "+$e.Curve.Oid.Value "A="+[System.Convert]::ToHexString($s.Curve.A) "B="+[System.Convert]::ToHexString($s.Curve.B) "Gx="+[System.Convert]::ToHexString($s.Curve.G.X) "Gy="+[System.Convert]::ToHexString($s.Curve.G.Y) "P="+[System.Convert]::ToHexString($s.Curve.Prime) "Order="+[System.Convert]::ToHexString($s.Curve.Order) "`n== Private key ==" "D= "+[System.Convert]::ToHexString($e.D) "`nPublic key" "Qx= "+[System.Convert]::ToHexString($e.Q.X) "Qy= "+[System.Convert]::ToHexString($e.Q.Y)
A sample run for a secp256k1 key pair:
Curve: secp256k1 Curve: A=0000000000000000000000000000000000000000000000000000000000000000 B=0000000000000000000000000000000000000000000000000000000000000007 Gx=79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 Gy=483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8 P=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F Order=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 == Private key == D= 3457C26D32D8FFA31FCACC8B0E763893456FD602F1281366DC25577D2B95E2DE Public key Qx= DAA2664FA4FD50D27E9A44973FF4E8E884A0D63A2147FDAC1D51173AA4507E01 Qy= 7B0DF15E25FDA3C304C9DC75519EF306F2AA121E4FA81C02E5F35EFCCD23D507
A sample run for a NIST P256 key pair:
Curve: nistp256 Curve: A=FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC B=5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B Gx=6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296 Gy=4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5 P=FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF Order=FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551 == Private key == D= 55CE54AB087BD031BC23F7918586FF5158B02228CDFE40A354111E8AC62BB6E4 Public key Qx= 968862C3B9462691CBA156931FC7112CB5F156BC15599737B0995B4CDEBA1D09 Qy= 803785247240DDB253F4F766F8C8B58659F3A4836247ACA8547EDEB312A466E7
A sample run for a NIST P521 key pair:
Curve: nistP521 Curve: 1.3.132.0.35 A=01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC B=0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00 Gx=00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66 Gy=011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650 P=01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Order=01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409 == Private key == D= 00C21C76F50EBCC018F46F0E791023B6D8E2BD4295FAE5E94FE26F5C1CE6F484133CC94CB8D7546A912AF02C2810240D161C5D59533C3841BCD505FE29E027145FC4 Public key Qx= 00449ACFB2291E4E92FF9530786E124F2F32DDD4E1CD3ADCBA070FFA218A9FC2894AC6C68F2A2E48724A155AE5190A54792FC350F426DF0281239569B3CEEBF67C11 Qy= 01CAEA2A12BAFBB81173A1BBDADD697FF44C2CEFDF853E2578A60B2C54C91F1181653ADF3B29745DA34BE3C22FE222541617DCB0FB9CF0315483889DE346F67FE96C