我想在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();
}
答案 0 :(得分:3)
从斯坦宁格的回答中,我得到以下内容来处理我的样本密钥。
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();
}
}
答案 1 :(得分:1)
看看下面的代码。私钥在此示例中由as64编码的字符串给出,并且还返回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());
}
答案 2 :(得分: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();