¿Es esta la forma correcta de usar Bouncy Castle para generar una clave compatible con Bitcoin?

Me gustaría usar Bouncy Castle para generar el par de llaves para usar con todas las *variantes de monedas.

¿Es esta la implementación correcta para obtener la curva ECC correcta que usan las * variantes de monedas?

    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);
        gen.Init(keyGenParam);

        return gen.GenerateKeyPair();
    }
IIRC, bitcoin usa una clave ECDSA que se codifica con RIPEMD-160. Para conocer los detalles, debe consultar la wiki de bitcoin o vanitygen .
@NickODell Porté Base58Check (RIPE160 + Sha256) a .NET/C# y pasó todas las pruebas. Todo lo que necesito ayuda es la curva ECDSA. Creo que Bouncy es la única manera...
Acabo de verificar, y tienes razón acerca de hacer sha256 primero. Por curiosidad, ¿qué estás haciendo que requiere generar claves pero no puede usar bitcoind?
@NickODell Me temo que no puedo anunciar nada ahora. Tendré una línea de tiempo en febrero.
@LamonteCristo, ¿podemos saber ahora 5 años después? :PAGS

Respuestas (2)

El siguiente extracto debería responder a su pregunta.

clase pública ECKeyPair implementa clave
{
    privado estático final SecureRandom secureRandom = nuevo SecureRandom ();
    curva privada estática final X9ECParameters = SECNamedCurves.getByName ("secp256k1");
    dominio ECDomainParameters final estático privado = nuevo ECDomainParameters (curve.getCurve (), curve.getG (), curve.getN (), curve.getH ());

    privado BigInteger priv;
    byte privado[] pub;
    booleano privado comprimido;


    public static ECKeyPair createNew (booleano comprimido)
    {
        ECKeyPairGenerator generador = nuevo ECKeyPairGenerator ();
        ECKeyGenerationParameters keygenParams = nuevos ECKeyGenerationParameters (dominio, seguroRandom);
        generador.init (keygenParams);
        par de claves AsymmetricCipherKeyPair = generator.generateKeyPair ();
        ECPrivateKeyParameters privParams = (ECPrivateKeyParameters) keypair.getPrivate ();
        ECPublicKeyParameters pubParams = (ECPublicKeyParameters) keypair.getPublic ();
        ECKeyPair k = nuevo ECKeyPair ();
        k.priv = privParams.getD ();
        k.comprimido = comprimido;
        si (comprimido)
        {
            ECPoint q = pubParams.getQ ();
            k.pub = new ECPoint.Fp (dominio.getCurve (), q.getX (), q.getY (), true).getEncoded ();
        }
        más
        {
            k.pub = pubParams.getQ ().getEncoded ();
        }
        devolver k;
    }

}

Consulte https://github.com/bitsofproof/supernode para obtener más detalles.

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