I'd like to use Bouncy Castle to generate the keypair for use with all *coin variants.

Is this the correct implementation to get the correct ECC curve that the *coin variants use?

    Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair GenerateKeys(int keySize)
        var gen = new Org.BouncyCastle.Crypto.Generators.ECKeyPairGenerator();
        var secureRandom = new Org.BouncyCastle.Security.SecureRandom();
        var keyGenParam = new Org.BouncyCastle.Crypto.KeyGenerationParameters(secureRandom, keySize);

        return gen.GenerateKeyPair();
  • IIRC, bitcoin uses an ECDSA key that is hashed using RIPEMD-160. For the particulars, you should look at the bitcoin wiki or vanitygen. – Nick ODell Dec 20 '12 at 1:53
  • @NickODell I ported Base58Check (RIPE160 + Sha256) to .NET / C# and that is passing all tests. All I need help with is the ECDSA curve. I think Bouncy is the only way... – Christopher Dec 20 '12 at 1:59
  • I just checked, and you are correct about it doing sha256 first. Out of curiosity, what are you making that requires generating keys but can't use bitcoind? – Nick ODell Dec 20 '12 at 2:32
  • @NickODell I'm afraid I can't announce anything now. I'll have a timeline in Feb. – Christopher Dec 20 '12 at 2:59
  • 1
    @LamonteCristo can we now know 5 years later? :P – knocte Jan 6 '18 at 18:23

Below extract should answer your question.

public class ECKeyPair implements Key
    private static final SecureRandom secureRandom = new SecureRandom ();
    private static final X9ECParameters curve = SECNamedCurves.getByName ("secp256k1");
    private static final ECDomainParameters domain = new ECDomainParameters (curve.getCurve (), curve.getG (), curve.getN (), curve.getH ());

    private BigInteger priv;
    private byte[] pub;
    private boolean compressed;

    public static ECKeyPair createNew (boolean compressed)
        ECKeyPairGenerator generator = new ECKeyPairGenerator ();
        ECKeyGenerationParameters keygenParams = new ECKeyGenerationParameters (domain, secureRandom);
        generator.init (keygenParams);
        AsymmetricCipherKeyPair keypair = generator.generateKeyPair ();
        ECPrivateKeyParameters privParams = (ECPrivateKeyParameters) keypair.getPrivate ();
        ECPublicKeyParameters pubParams = (ECPublicKeyParameters) keypair.getPublic ();
        ECKeyPair k = new ECKeyPair ();
        k.priv = privParams.getD ();
        k.compressed = compressed;
        if ( compressed )
            ECPoint q = pubParams.getQ ();
            k.pub = new ECPoint.Fp (domain.getCurve (), q.getX (), q.getY (), true).getEncoded ();
            k.pub = pubParams.getQ ().getEncoded ();
        return k;


Check out https://github.com/bitsofproof/supernode for more details.

        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");
        var keyPair = generator.GenerateKeyPair();
        ns.privateKey = keyPair.Private as ECPrivateKeyParameters;
        ns.publicKey = keyPair.Public as ECPublicKeyParameters;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.