c# - 使用 BouncyCastle SHA-256withPLAIN-ECDSA 的确定性签名
问题描述
我目前正在使用如下所示的代码进行签名。我正在尝试找到一种创建确定性签名的方法。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();
解决方案
是的。下面显示了使用曲线 P-256 aka secp256r1 和来自RFC6979, A.2.5的测试向量生成具有确定性 ECDSA 的签名:
- 测试向量:
私钥:
x = C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721使用 SHA-256,消息 = “样本”:
r = EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716
s = F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4ACDA88
- 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
匹配测试向量的签名。
推荐阅读
- php - 在 url 中设置斜杠时资产无法正确加载
- mysql - MySQL 在 LIKE 的查询中重写字符串?
- python - 在没有任意字符串的python中加载和使用配置文件
- c# - 无法注册 Mongo 映射
- python - MacOS:在python shell中插入一列用鼠标选择的值,由CMD + C复制并将其作为列直接插入到另一个编辑的vim文件中
- java - 我在我的 Postman 中遇到了这个错误(POST 和 DELETE 出现了这个错误),希望有人能解决这个问题
- postgresql - 从出现在多个表中的列中动态选择出现次数最多的值
- angular - 简化 angular.json 配置以实现国际化
- android - 如何在颤振中增加芯片的宽度
- python - 使用 Keras 训练 CNN-LSTM 时卡在第一个 epoch