4

C# でビットコイン トランザクションに署名しようとしています。完成させようとしているコードが 2 ビットあります。Bouncy Castle を使用して秘密鍵と公開鍵のセットを作成できます。これをウォレットのインポート形式に変換できます。

ECDSA 公開鍵からビットコイン アドレスを生成することもできます。

ただし、トランザクションに署名したいのですが、持っているのは自分の秘密鍵だけです。ウォレットにインポートして署名する必要はありません。では、秘密鍵だけが与えられた場合、どうすれば公開鍵を生成できますか?

これを行うJavaScriptメソッドを見つけました:

ecparams.getG().multiply(this.priv).getEncoded();

私が Bouncy Castle で見た唯一の方法は、ランダムなペアを生成することです。

private static AsymmetricCipherKeyPair GenerateKeys(int keySize)
{
  ECKeyPairGenerator gen = new ECKeyPairGenerator();
  SecureRandom secureRandom = new SecureRandom();
  KeyGenerationParameters keyGenParam = new KeyGenerationParameters(secureRandom, keySize);
  gen.Init(keyGenParam);
  return gen.GenerateKeyPair();
}
4

3 に答える 3

3

steininger の回答から、私が持っていたサンプルキーを操作するために次のようになりました。

using Org.BouncyCastle.Asn1.Sec;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;

public static class Example
{
    private static X9ECParameters curve = SecNamedCurves.GetByName("secp256k1");
    private static ECDomainParameters domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H);

    public static byte[] ToPublicKey(byte[] privateKey)
    {
        BigInteger d = new BigInteger(privateKey);
        ECPoint q = domain.G.Multiply(d);

        var publicParams = new ECPublicKeyParameters(q, domain);
        return publicParams.Q.GetEncoded();
    }
}
于 2016-08-03T22:43:51.623 に答える