Skip to content

Instantly share code, notes, and snippets.

@mikaelo
Forked from tmarkovski/Program.cs
Created March 9, 2021 17:08
Show Gist options
  • Save mikaelo/6d7f8250e7c6a90af90dbe12ce4d20d4 to your computer and use it in GitHub Desktop.
Save mikaelo/6d7f8250e7c6a90af90dbe12ce4d20d4 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