首页 文章

Bouncy Castle ESCDA从私钥创建公钥

提问于
浏览
2

我想在c#中签署一个比特币交易 . 我有2位代码我想完成 . 我可以使用Bouncy城堡创建一组私钥和公钥 . 我可以将此转换为钱包导入格式确定 .

我还可以从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 回答

  • 2

    从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();
        }
    }
    
  • -3

    看看下面的代码 . 在此示例中,私钥由base64编码的字符串给出,并且还返回base64编码的字符串 . 注释的keyParameters正在工作,所以如果你想拥有键和曲线,请使用这个 .

    private static readonly Org.BouncyCastle.Asn1.X9.X9ECParameters curve = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256r1");
    private static readonly Org.BouncyCastle.Crypto.Parameters.ECDomainParameters domain = new Org.BouncyCastle.Crypto.Parameters.ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H);
    public string GetPublicKey(string privKey)
    {
          Org.BouncyCastle.Math.BigInteger d = new Org.BouncyCastle.Math.BigInteger(Convert.FromBase64String(privKey));
          //var privKeyParameters = new Org.BouncyCastle.Crypto.Parameters.ECPrivateKeyParameters(d, domain);
          Org.BouncyCastle.Math.EC.ECPoint q = domain.G.Multiply(d);
          //var pubKeyParameters = new Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters(q, domain);
          return Convert.ToBase64String(q.GetEncoded());
    }
    
  • 1

    如果你正在处理DER编码键,它甚至更简单:

    var privateKey = PrivateKeyFactory.CreateKey(bytes) as ECPrivateKeyParameters;
      if (privateKey == null)
           return null;
      Org.BouncyCastle.Math.EC.ECPoint q = privateKey.Parameters.G.Multiply(privateKey.D);
      var publicParams = new ECPublicKeyParameters(privateKey.AlgorithmName, q, privateKey.PublicKeyParamSet);
      return SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicParams).GetDerEncoded();
    
  • 1

    我不是C#程序员,但你可以在pybitcoin工具中遵循privkey原语到公钥 .

    https://github.com/vbuterin/pybitcointools/blob/master/bitcoin/main.py#L344

相关问题