using System.Security.Cryptography;
public static void Main()
using ECDiffieHellman ecdhPublic1 = getPublicKey("04c0ba9a4bca3066a2dec5fc9b1203153e24ec8b69c023c217cfa466adb9fdc3cd399f04a7fedb45ccc5df8e24aadac623d4ec8109326c287f6803930446eb4945");
using ECDiffieHellman ecdhPrivate1 = getPrivateKey("e7d872d42157246e0e243e5d96934b798aa82b39d9d2b6c6a82435a6b233b1e5");
var sharedSecret1 = ecdhPrivate1.DeriveRawSecretAgreement(ecdhPublic1.PublicKey);
Console.WriteLine(Convert.ToHexString(sharedSecret1));
using ECDiffieHellman ecdhPublic2 = getPublicKey("04182ff13b467beae05551dc1bd51b2c693ac4c3c771aadc5fd31529a33f729ea022cd80601e79094f89905bb55ddc47d04328dead9b6815c188d7356b05772aa4");
using ECDiffieHellman ecdhPrivate2 = getPrivateKey("4b9d93b20faf53724e6d21f8e73229771674e5c9e7fc8e3d7a86cdc436e9653f");
var sharedSecret2 = ecdhPrivate2.DeriveRawSecretAgreement(ecdhPublic2.PublicKey);
Console.WriteLine(Convert.ToHexString(sharedSecret2));
private static ECDiffieHellman getPrivateKey(string privateHex)
byte[] rawPrivate = Convert.FromHexString(privateHex);
ECParameters privateParameters = new()
Curve = ECCurve.NamedCurves.nistP256,
return ECDiffieHellman.Create(privateParameters);
private static ECDiffieHellman getPublicKey(string publicCompressedHex)
ECPoint rawPublic = new()
X = Convert.FromHexString(publicCompressedHex).Skip(1).Take(32).ToArray(),
Y = Convert.FromHexString(publicCompressedHex).Skip(1 + 32).Take(32).ToArray()
ECParameters publicParameters = new()
Curve = ECCurve.NamedCurves.nistP256,
return ECDiffieHellman.Create(publicParameters);