使用BouncyCastle生成SHA-256withPLAIN-ECDSA确定性签名是否可行?
可以通过BouncyCastle实现确定性ECDSA签名,你当前使用的普通ECDSA签名逻辑采用随机k值生成签名,因此相同输入每次签名结果不同,只要替换为遵循RFC6979规范的确定性k生成逻辑即可实现需求。
修改后的代码示例
var curve = SecNamedCurves.GetByName("secp256r1"); var domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H); var keyParameters = new ECPrivateKeyParameters( new Org.BouncyCastle.Math.BigInteger(1, privateKey), domain); // 替换为RFC6979规范的确定性ECDSA签名器,算法名按实际使用的哈希调整,比如SHA1、SHA512对应修改前缀 ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSARFC6979"); // 如果需要输出PLAIN格式(r+s拼接,不是DER编码),可以手动构造签名器: // var signer = new DsaDigestSigner(new ECDsaSigner(new HMacDsaKCalculator(DigestUtilities.GetDigest("SHA-256"))), DigestUtilities.GetDigest("SHA-256"), new PlainDsaEncoding()); signer.Init(true, keyParameters); signer.BlockUpdate(message, 0, message.Length); var signature = signer.GenerateSignature();
注意事项
- 如果你需要保留原有
PLAIN-ECDSA的输出格式(r值和s值直接拼接,而非默认DER编码格式),请使用代码注释中手动构造签名器的写法,输出格式和原有逻辑完全一致,仅将k值生成逻辑改为确定性派生。 - RFC6979是行业通用的确定性签名规范,安全性和传统随机k的ECDSA完全一致,不存在额外安全风险。
内容的提问来源于stack exchange,提问作者Warrick FitzGerald
相关产品推荐
相关产品推荐

