2014-02-25 93 views
2

我想在c#中籤署比特幣交易。我有2位代碼正在嘗試完成。我可以用Bouncy城​​堡創建一組私人和公共密鑰。我可以將其轉換爲錢包導入格式。Bouncy Castle ESCDA從私鑰中創建公鑰

我也可以從ECDSA公鑰生成比特幣地址。

但是,我想簽署一個交易,我擁有的就是我的私鑰。我不想進口到錢包和標誌。那麼我怎麼才能生成公鑰,只給私鑰?

我發現,這是否一個JavaScript方法:

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

我在充氣城堡中看到的唯一方法是生成一個隨機對。

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

回答

1

看看下面的代碼。在這個例子中私鑰是由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()); 
} 
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(); 
    } 
}