1

I have following code:

ECDiffieHellman ecdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP256);
ECDiffieHellmanPublicKey ecdhPublic = ecdh.PublicKey;

How can I export the ECDiffieHellmanPublicKey instance (ecdhPublic) into DER encoded file?

Raghu
  • 2,859
  • 4
  • 33
  • 65
  • https://stackoverflow.com/questions/44502331/c-sharp-get-cngkey-object-from-public-key-in-text-file/44527439#44527439, but in reverse – bartonjs Jan 30 '18 at 15:34

1 Answers1

2

Using BouncyCastle (http://www.bouncycastle.org/) you can export your ECDH public key to a DER encoded ANS.1 Object

X9ECParameters ecP = NistNamedCurves.GetByName("P-256");
ECDomainParameters ecSpec = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
ECKeyPairGenerator g = new ECKeyPairGenerator();
g.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));

AsymmetricCipherKeyPair server = g.GenerateKeyPair();
ECPublicKeyParameters serverPub = (ECPublicKeyParameters)server.Public;
var result = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(serverPub).GetDerEncoded();
usselite
  • 846
  • 7
  • 24
  • How can I get ECPublicKeyParameters directly given that I have X and Y ordinates of the point for the P-256 curve? – Raghu Jan 31 '18 at 03:07
  • Not entirely sure, haven't come to that usecase yet. Probably will look somewhere along the lines of: `BigInteger x = new BigInteger("0"); BigInteger y = new BigInteger("0"); ECPoint example = ecP.Curve.CreatePoint(x, y); //needs to be a bouncy castle biginteger x, y ECDomainParameters ecSpec = new ECDomainParameters(ecP.Curve, example, ecP.N, ecP.H, ecP.GetSeed());` – usselite Jan 31 '18 at 07:59
  • 1
    Tried following and it worked. string curveName = "P-256"; X9ECParameters ecP = NistNamedCurves.GetByName(curveName); FpCurve c = (FpCurve)ecP.Curve; byte[] pointBytes = Utility.HexToBytes( "0418a3d65a2f886e0ba479e75912b0a04b35724f99369d36a87babbcd780d40d73208c2a105a91d7a98b38169bb69fcdadb98c0a13cdbdf8752e2ea20468101af8"); var q = c.DecodePoint(pointBytes); var keyParameters = new ECPublicKeyParameters("ECDH", q, SecObjectIdentifiers.SecP256r1); var result = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keyParameters).GetDerEncoded(); – Raghu Jan 31 '18 at 14:47