【问题标题】:deterministic signatures using BouncyCastle SHA-256withPLAIN-ECDSA使用 BouncyCastle SHA-256withPLAIN-ECDSA 的确定性签名
【发布时间】:2021-08-23 21:08:20
【问题描述】:

我目前正在使用如下所示的代码进行签名。我正在尝试找到一种创建确定性签名的方法。 BouncyCastle 可以做到这一点吗?

var curve = SecNamedCurves.GetByName("secp256r1");
var domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H);

var p = new Org.BouncyCastle.Math.BigInteger(privateKey);

var keyParameters = new ECPrivateKeyParameters(
                        new Org.BouncyCastle.Math.BigInteger(1,privateKey),
                        domain);

ISigner signer = SignerUtilities.GetSigner("SHA-256withPLAIN-ECDSA");

signer.Init(true, keyParameters);
signer.BlockUpdate(message, 0, message.Length);
var signature = signer.GenerateSignature();

【问题讨论】:

    标签: c# cryptography bouncycastle


    【解决方案1】:

    是的。下面显示了使用曲线 P-256 aka secp256r1 和来自RFC6979, A.2.5 的测试向量生成具有确定性 ECDSA 的签名:

    • 测试向量:

    私钥:
    x = C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721

    使用 SHA-256,message = "sample":
    r = EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716
    s = F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8

    • C#/BC 代码
    using Org.BouncyCastle.Asn1.Sec;
    using Org.BouncyCastle.Asn1.X9;
    using Org.BouncyCastle.Crypto.Digests;
    using Org.BouncyCastle.Crypto.Parameters;
    using Org.BouncyCastle.Crypto.Signers;
    using Org.BouncyCastle.Math;
    using Org.BouncyCastle.Utilities.Encoders;
    using System;
    using System.Text;
    ...
    string messageToSign = "sample";
    var digest = new System.Security.Cryptography.SHA256Managed();
    byte[] messageHash = digest.ComputeHash(Encoding.UTF8.GetBytes(messageToSign));
    
    X9ECParameters x9Params = SecNamedCurves.GetByName("secp256r1"); ;
    ECDomainParameters ecParams = new ECDomainParameters(x9Params.Curve, x9Params.G, x9Params.N, x9Params.H);
    ECPrivateKeyParameters privKey = new ECPrivateKeyParameters(new BigInteger(1, Hex.Decode("C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721")), ecParams);
    ECDsaSigner signer = new ECDsaSigner(new HMacDsaKCalculator(new Sha256Digest()));
    signer.Init(true, privKey);
    var signature = signer.GenerateSignature(messageHash);
    
    Console.WriteLine(signature[0].ToString(16).ToUpper()); // r: EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716
    Console.WriteLine(signature[1].ToString(16).ToUpper()); // s: F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8
    

    输出:

    EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716
    F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8
    

    匹配测试向量的签名。

    【讨论】:

    • 很奇怪。原来这里的cmets都消失了?
    • @WarrickFitzGerald - 我已经开始删除 cmets,因为内容超出了原始问题的范围。如果问题没有解决,请发布一个包含所有必要信息、C/C++ 代码和/或完整示例数据的新问题,以便进行比较。如果需要,您可以参考这篇文章。
    • 您的回答确实很棒。我在最初的问题中没有考虑到一些因素。如果需要,我会尝试解决这些问题并提出一个新问题。再次感谢您的宝贵时间\回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多