标签: ecdsa

Bouncy Castle ECDSA 从私钥创建公钥

我正在尝试用 C# 签署比特币交易。我有 2 位代码正在尝试完成。我可以使用 Bouncy castle 创建一组私钥和公钥。我可以将其转换为钱包导入格式。

我还可以从 ECDSA 公钥生成比特币地址。

但是,我想签署一笔交易,而我拥有的只是我的私钥。我不想导入钱包并签名。那么,在仅给出私钥的情况下,如何生成公钥呢?

我发现了一个 javascript 方法可以做到这一点:

ecparams.getG().multiply(this.priv).getEncoded();
Run Code Online (Sandbox Code Playgroud)

我在 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();
}
Run Code Online (Sandbox Code Playgroud)

c# bouncycastle bitcoin ecdsa

5
推荐指数
1
解决办法
9619
查看次数

定义 ECDSA 签名数据的规范

我想知道ECDSA签名和公钥的数据格式是什么规范(或标准)定义的?

我正在 java 卡上测试 ECDSA 签名。我发现签名和公钥值中有一个TLV格式。

* Public key (TV format)
[Tag=04] [public key value 1] [public key value 2]
04 038A3F59E813995DAB730588CFCBB985F5A1ED90C0D62960AE0B274D 2E6B12672318E0B113DECC0406B62887B6BCB9B1583B1A50779EAB5A

* Signature (TLV format)
[Tag=30] [Length=3C~3E] [Tag=02] [Length=1C~1D] [signature value 1] [Tag=02] [Length=1C~1D] [signature value 2]

303C 021C 7EEB0B2596F74344B3D7B046EA0BD17C4461FC277658CE93509F1674      021C 4F5DBFB30D994664DA80528847A767F0194876B068E5958161797991
303E 021D 0080F20B82D407AE663F010F4990F12073631D653EA1D65DC75EBD4293    021D 00880DB667EF51AEA8E7C9BB012496C7C9ECE3BC5829B82B692B9211C3
303D 021D 00F77447EF326A4A49597D0B839F68F524891F3655DA4561F1AA10EF70    021C 152F7FF18644C5E5C9118736E1F7528F0B10C5FF641C7B7CDF012129
303D 021D 00A2EBCC5C5981341D0726F2E846CC3879C74EFD64D8698589A8CEAB60    021C 6E04FF884A451D7C0737A182BC2DE7F7D3008EE182B46A009BFFC9E8
Run Code Online (Sandbox Code Playgroud)

我认为数据格式是在某些规范或标准中定义的。我只想知道文档名称。

format specifications javacard ecdsa

5
推荐指数
1
解决办法
6972
查看次数

使用 X509Certificate2 签署和验证 ECDSA-SHA256 签名

我曾经OpenSSL使用SHA256. 现在我想使用这些证书来签署数据并验证现有的签名。

我尝试使用DSACryptoServiceProvider,但它只支持SHA1MD5

不过好像ECDsaCng是可以支持的ECDSA-with-SHA256。我唯一的问题是我不知道如何将私钥和公钥从 myX509Certificate2转换为必要的CngKey. 我读了另一个问题,有人描述了如何转换公钥。但是为了能够对数据进行签名,我也需要私钥。

那么有没有办法CngKeyX509Certificate2. 证书有不同的格式。我将它们作为 PFX 文件,并分别作为 CER 和 PEM 文件。

我更愿意坚持使用.NET Framework 4,但如果根本不可能使用它,我也会切换到Bouncy Castle.

c# ssl sha256 x509certificate2 ecdsa

5
推荐指数
1
解决办法
1848
查看次数

在 C# 中使用 Bouncy Castle 验证 ECDSA 签名

当我尝试在 C# 中的 Bouncy Castle 中验证 ECDSA 签名时遇到问题。该代码是从我拥有的 Java 示例中采用的,因此我 100% 确定公钥和签名是正确的。但是 C# 实现总是返回签名无效。我检查了曲线参数,它们是正确的。我尝试使用 DER 和“原始”签名,但它再次不起作用。

任何人都可以发现我做错了什么:

namespace TestECDSA
{
    class Program
    {
    static void Main(string[] args)
    {
        byte[] b = new byte[] { 0x2B, 0xA1, 0x41, 0x00 };

        string pubKey = "044F6D3F294DEA5737F0F46FFEE88A356EED95695DD7E0C27A591E6F6F65962BAF";
        string signature = "AAD03D3D38CE53B673CF8F1C016C8D3B67EA98CBCF72627788368C7C54AA2FC4";

        X9ECParameters curve = SecNamedCurves.GetByName("secp128r1");
        ECDomainParameters curveSpec = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());

        ECPublicKeyParameters key = new ECPublicKeyParameters("ECDSA", curve.Curve.DecodePoint(Hex.Decode(pubKey)), curveSpec);

        ISigner signer = SignerUtilities.GetSigner("NONEwithECDSA");             

        signer.Init(false, key);

        signer.BlockUpdate(b, 0, b.Length);

        if (signer.VerifySignature(derEncodeSignature(Hex.Decode(signature))))
            System.Console.WriteLine("Verified Signature"); …
Run Code Online (Sandbox Code Playgroud)

c# encryption bouncycastle ecdsa

5
推荐指数
2
解决办法
5396
查看次数

从 ECC X509Certificate 创建 X509Certificate2 在 C# 中抛出“System.NotSupportedException”

我需要将 ECC 证书导入 C# 中的 Windows 密钥库。作为第一步,我使用 BouncyCastle 生成 EC 密钥对,使用公钥创建 X509 证书,并使用 ECDSA 和私钥对其进行签名,即:

            var ecKeyPairGenerator = new ECKeyPairGenerator("ECDSA");
            ECKeyGenerationParameters ecKeyGenParams =
                new ECKeyGenerationParameters(SecObjectIdentifiers.SecP384r1, new SecureRandom());
            ecKeyPairGenerator.Init(ecKeyGenParams);
            AsymmetricCipherKeyPair pair = ecKeyPairGenerator.GenerateKeyPair();
            PrivateKeyInfo privKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(pair.Private);
            SubjectPublicKeyInfo pubKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pair.Public);

            X509V3CertificateGenerator bcX509Gen = new X509V3CertificateGenerator();
// set cert fields
...
            bcX509Gen.SetPublicKey(pair.Public);
            Asn1SignatureFactory bcSigFactory =
                    new Asn1SignatureFactory(X9ObjectIdentifiers.ECDsaWithSha384.Id, pair.Private);
            X509Certificate bcCert = bcX509Gen.Generate(bcSigFactory);
Run Code Online (Sandbox Code Playgroud)

然后,我使用上面创建的证书创建一个 X509Certificate2,即:

    SystemX509.X509Certificate2 msCert2 = 
        new SystemX509.X509Certificate2(bcCert.GetEncoded(), (string)null);
Run Code Online (Sandbox Code Playgroud)

但是,在创建 X509Certificate2 时会引发异常:

'msCert2.PublicKey.Key' threw an exception of type 'System.NotSupportedException'
"The …
Run Code Online (Sandbox Code Playgroud)

.net c# bouncycastle x509certificate2 ecdsa

5
推荐指数
1
解决办法
2542
查看次数

创建ECDSA DER编码签名

我正在尝试用Java创建ECDSA签名。当我在python中创建一个时,可以在Java中进行验证。但是反之亦然给我一个BadSignatureException.Python使用ECDSA库而Java使用SpongyCastle。

Python实现签名:

private_key = SigningKey.from_der(PRIVATE_KEY.decode('hex'))
private_key.sign(payload, hashfunc=hashlib.sha256, 
sigencode=sigencode_der).encode('hex'),
Run Code Online (Sandbox Code Playgroud)

验证的Python实现

verifying_key = VerifyingKey.from_der(public_key.decode('hex'))
return vk.verify(signature.decode('hex'), payload, hashfunc=hashlib.sha256, sigdecode=sigdecode_der)
Run Code Online (Sandbox Code Playgroud)

Java签名实现

signature = Signature.getInstance("SHA256withECDSA", "SC");
signature.initSign(this.privateKey);
signature.update(input.getBytes("UTF-8"));
return new String(Hex.encode(signature.sign()));
Run Code Online (Sandbox Code Playgroud)

验证的Java实现

signature = Signature.getInstance("SHA256withECDSA", "SC");
signature.initVerify(publicKey);
signature.update(input.getBytes("UTF-8"));
return signature.verify(Hex.decode(expectedSignature));
Run Code Online (Sandbox Code Playgroud)

python java encoding sign ecdsa

5
推荐指数
1
解决办法
539
查看次数

ECDSA 与 BouncyCastle 签署并使用 Crypto++ 进行验证

这是Java代码:

public static String sign(String data) throws Exception {
    KeyPair keyPair = loadKeyPair(System.getProperty("user.dir"), "ECDSA");
    Signature signature = Signature.getInstance("SHA256withECDSA", "BC");
    signature.initSign(keyPair.getPrivate(), new SecureRandom());

    byte[] message = data.getBytes();
    signature.update(message);

    byte[] sigBytes = signature.sign();        
    String signatureStr = new BigInteger(1, sigBytes).toString(16);
    return signatureStr;
}
Run Code Online (Sandbox Code Playgroud)

然后是验证签名的C++代码

bool VerifyMessage( const ECDSA<ECP, SHA256>::PublicKey& key, const string& message, const string& signature )
{
    bool result = false;

    // Hexa encoding version, more readable
    std::string decodedSignature;
    StringSource(signature, true,
                    new HexDecoder(
                       new StringSink(decodedSignature)));

    StringSource(decodedSignature+message, true,
                    new SignatureVerificationFilter(ECDSA<ECP,SHA256>::Verifier(key),
                       new ArraySink((byte*)&result, sizeof(result)))); …
Run Code Online (Sandbox Code Playgroud)

c++ java bouncycastle crypto++ ecdsa

5
推荐指数
1
解决办法
3354
查看次数

微软压缩天然气 | 如何将 PEM 编码的 ECDSA 私钥导入 MS Key Storage Provider

我知道 MS CNG 私人有这种格式 - BCRYPT_ECCKEY_BLOB BYTE X[cbKey] // Big-endian. BYTE Y[cbKey] // Big-endian. BYTE d[cbKey] // Big-endian.

因此试图导入以下关键字节 -

byte[] ec256PrivKB =
{
//Magic + CBLength
0x45, 0x43, 0x53, 0x31, 0x20, 0x00, 0x00, 0x00,
//X
0xA7, 0xFB, 0xCD, 0x4D, 0x7E, 0x43, 0x6F, 0x22, 0xBD, 0x74, 0xFA, 0x1F, 0xD7, 0x10, 0xDB, 0x8C, 0xF8, 0x29, 0xC1, 0xEC, 0x5E, 0x15, 0x1E, 0xE2, 0x84, 0x56, 0x3E, 0x54, 0x6E, 0x1D, 0x5C, 0xF6, 
//Y
0x6B, 0x42, 0x21, 0xD1, 0x92, 0xEB, 0x69, 0x66, 0x56, 0xD6, 0xEC, …
Run Code Online (Sandbox Code Playgroud)

openssl cryptography pem cng ecdsa

5
推荐指数
1
解决办法
1977
查看次数

PHP创建ECDSA签名并使用Golang进行验证

我尝试使用PHP创建可为某些文档创建ECDSA签名的应用程序,并使用Golang应用程序验证该签名。

我使用由openssl工具生成的私钥。这是prime256v1曲线密钥。用以下命令创建:

openssl ecparam -name prime256v1 -genkey -noout -out prime256v1-key.pem
Run Code Online (Sandbox Code Playgroud)

在PHP中,我使用openssl_sign函数创建签名。

我所有使用Golang验证签名的尝试都失败了。在Golang中使用crypto / ecdsa,crypto / elliptic软件包。

有我的代码。

的PHP

<?php

$stringtosign = "my test string to sign";

// Privcate key was geerated with openssl tool with the command
// openssl ecparam -name prime256v1 -genkey -noout -out prime256v1-key.pem
$cert = file_get_contents('prime256v1-key.pem');

$prkey = openssl_pkey_get_private($cert);

// we sign only hashes, because Golang lib can wok with hashes only
$stringtosign = md5($stringtosign);

// we generate 64 length signature (r and s 32 bytes length) …
Run Code Online (Sandbox Code Playgroud)

php go ecdsa

5
推荐指数
1
解决办法
775
查看次数

如何从先前生成的 ECDSA 编码密钥对构造私钥?

生成私钥如下:

    fun getKeyPair(): Pair<ByteArray, ByteArray> {
        Security.addProvider(provider)
        val generator = KeyPairGenerator.getInstance("ECDSA")
        val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
        generator.initialize(ecSpec)
        val keyPair = generator.generateKeyPair()
        val publicKey = keyPair.public as ECPublicKey
        val privateKey = keyPair.private
        return Pair(publicKey.q.getEncoded(true), privateKey.getEncoded())
    }
Run Code Online (Sandbox Code Playgroud)

公钥可以像这样再次重建:

    Security.addProvider(...spongy castle provider)
    val ecSpecs = ECNamedCurveTable.getParameterSpec("secp256r1")
    val q = ecSpecs.curve.decodePoint(publicKeyEncoded)
    val pubSpec = ECPublicKeySpec(q, ecSpecs)
    val keyFactory = KeyFactory.getInstance("ECDSA")
    val generatedPublic = keyFactory.generatePublic(pubSpec)
Run Code Online (Sandbox Code Playgroud)

如何同时从字节重建私钥?

更新:

此代码在实际应用程序中运行良好,但在 JUnit 测试中则不然:

val keyFactory = KeyFactory.getInstance("ECDSA")
val privSpec = PKCS8EncodedKeySpec(privateEncoded)
val generatedPrivate = keyFactory.generatePrivate(privSpec)
Run Code Online (Sandbox Code Playgroud)

在 JUnit 测试中我收到此错误:

java.security.spec.InvalidKeySpecException: …
Run Code Online (Sandbox Code Playgroud)

android cryptography bouncycastle kotlin ecdsa

5
推荐指数
1
解决办法
1143
查看次数