Является ли это правильным способом использования Bouncy Castle для создания ключа, совместимого с биткойнами?

Я хотел бы использовать Bouncy Castle для создания пары ключей для использования со всеми вариантами *coin.

Является ли это правильной реализацией для получения правильной кривой ECC, которую используют варианты *coin?

    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, биткойн использует ключ ECDSA, который хэшируется с использованием RIPEMD-160. Для получения подробной информации вы должны посмотреть вики о биткойнах или vanitygen .
@NickODell Я портировал Base58Check (RIPE160 + Sha256) на .NET/C#, и он проходит все тесты. Мне нужна помощь только с кривой ECDSA. Я думаю, что Боунси - единственный способ...
Я только что проверил, и вы правы в том, что сначала делаете sha256. Из любопытства, что вы делаете, что требует генерации ключей, но не может использовать биткойн?
@NickODell Боюсь, я не могу ничего объявить сейчас. У меня будет график в феврале.
@LamonteCristo, можем ли мы узнать это через 5 лет? :П

Ответы (2)

Ниже выдержка должна ответить на ваш вопрос.

открытый класс ECKeyPair реализует ключ
{
    частный статический окончательный SecureRandom secureRandom = новый SecureRandom ();
    частная статическая окончательная кривая X9ECParameters = SECNamedCurves.getByName ("secp256k1");
    частный статический окончательный домен ECDomainParameters = новый ECDomainParameters (curve.getCurve (), curve.getG (), curve.getN (), curve.getH ());

    частный BigInteger priv;
    закрытый байт [] паб;
    сжатое частное логическое значение;


    public static ECKeyPair createNew (логическое сжатие)
    {
        Генератор ECKeyPairGenerator = новый ECKeyPairGenerator ();
        ECKeyGenerationParameters keygenParams = новые параметры ECKeyGenerationParameters (domain, secureRandom);
        генератор.инит(keygenParams);
        Пара ключей AsymmetricCipherKeyPair = генератор.генерироватьKeyPair ();
        ECPrivateKeyParameters privParams = (ECPrivateKeyParameters) keypair.getPrivate ();
        ECPublicKeyParameters pubParams = (ECPublicKeyParameters) keypair.getPublic ();
        ECKeyPair k = новая ECKeyPair ();
        k.priv = privParams.getD();
        k.compressed = сжатый;
        если (сжато)
        {
            ECPoint q = pubParams.getQ ();
            k.pub = new ECPoint.Fp(domain.getCurve(), q.getX(), q.getY(), true).getEncoded();
        }
        еще
        {
            k.pub = pubParams.getQ().getEncoded();
        }
        вернуть к;
    }

}

Посетите https://github.com/bitsofproof/supernode для более подробной информации.

        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;