Skip to content

Instantly share code, notes, and snippets.

@tmarkovski
Last active April 16, 2024 06:55
Show Gist options
  • Save tmarkovski/9fc008fc034511bbbee93a5c4cd1a99a to your computer and use it in GitHub Desktop.
Save tmarkovski/9fc008fc034511bbbee93a5c4cd1a99a to your computer and use it in GitHub Desktop.
Generate elliptic curve SECP256K1 key pair using Bouncy Castle for .NET
using System;
using System.Linq;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
namespace Program
{
class Program
{
static void Main(string[] args)
{
GenerateKeyPair();
}
static AsymmetricCipherKeyPair GenerateKeyPair()
{
var curve = ECNamedCurveTable.GetByName("secp256k1");
var domainParams = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
var secureRandom = new SecureRandom();
var keyParams = new ECKeyGenerationParameters(domainParams, secureRandom);
var generator = new ECKeyPairGenerator("ECDSA");
generator.Init(keyParams);
var keyPair = generator.GenerateKeyPair();
var privateKey = keyPair.Private as ECPrivateKeyParameters;
var publicKey = keyPair.Public as ECPublicKeyParameters;
Console.WriteLine($"Private key: {ToHex(privateKey.D.ToByteArrayUnsigned())}");
Console.WriteLine($"Public key: {ToHex(publicKey.Q.GetEncoded())}");
return keyPair;
}
static string ToHex(byte[] data) => String.Concat(data.Select(x => x.ToString("x2")));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment