我正在尝试使用带有secp256r1曲线(P256)的ECDSA和用于消息散列的SHA256算法生成签名。我也在使用.NET库。代码如下,
using System;
using System.Security.Cryptography;
namespace ProjetTest
{
public static class TestProgram
{
public static void Main()
{
var data = new byte[100];
new Random().NextBytes(data);
var dataHash = new SHA256Cng().ComputeHash(data);
var cng = new ECDsaCng(256);
cng.HashAlgorithm = CngAlgorithm.Sha256;
var signOnHash = cng.SignHash(dataHash);
var signOnData = cng.SignData(data);
}
}
}
SignOnHash和SignOnData应该包含相同的字节数组,但它们不会。 需要帮助。
答案 0 :(得分:3)
问题在于(EC)DSA算法本身是非确定性的 - 它在内部依赖于安全随机数生成器。因此,在生成相同的签名之前,您必须等待非常很长时间。
事实上RSA对于较老的 - 但更普遍的 - PKCS#1 v1.5填充是确定性的,这是一个侥幸,这是通过引入PSS填充来解决的。因此,一般来说,您应该期望签名算法创建难以与随机区分的签名。
您可以通过删除new Random().NextBytes(data);
语句自行尝试,即使没有它,结果也应该不同。请注意,如果基础随机数被破坏,则可以从ECDSA签名计算私钥{。{3}}。