Cryptography 使用SignData或SignHash生成ECDsaCng签名会产生不同的结果
我正在尝试使用ECDSA和secp256r1曲线(P256)以及用于消息哈希的SHA256算法生成签名。我也在使用网络库。代码如下:Cryptography 使用SignData或SignHash生成ECDsaCng签名会产生不同的结果,cryptography,ecdsa,Cryptography,Ecdsa,我正在尝试使用ECDSA和secp256r1曲线(P256)以及用于消息哈希的SHA256算法生成签名。我也在使用网络库。代码如下: using System; using System.Security.Cryptography; namespace ProjetTest { public static class TestProgram { public static void Main() { var data =
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应该包含相同的字节数组,但它们不包含。
需要帮助。问题在于(EC)DSA算法本身是不确定的-它内部依赖于安全的随机数生成器。因此,在生成相同的签名之前,您必须等待很长时间
RSA对于更老但更流行的PKCS#1 v1.5填充具有确定性这一事实是一个侥幸,PSS填充的引入解决了这一问题。所以一般来说,您应该期望签名算法创建的签名很难与随机签名区分开来
您可以通过删除new Random().NextBytes(数据)自己尝试这一点代码>语句,即使没有它,每次的结果也应该不同。请注意,如果基础随机数被破坏,则可以从ECDSA签名计算私钥