Cryptography 使用SignData或SignHash生成ECDsaCng签名会产生不同的结果

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 =

我正在尝试使用ECDSA和secp256r1曲线(P256)以及用于消息哈希的SHA256算法生成签名。我也在使用网络库。代码如下:

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签名计算私钥