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

时间:2014-12-13 18:36:13

标签: cryptography ecdsa

我正在尝试使用带有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应该包含相同的字节数组,但它们不会。 需要帮助。

1 个答案:

答案 0 :(得分:3)

问题在于(EC)DSA算法本身是非确定性的 - 它在内部依赖于安全随机数生成器。因此,在生成相同的签名之前,您必须等待非常很长时间。

事实上RSA对于较老的 - 但更普遍的 - PKCS#1 v1.5填充是确定性的,这是一个侥幸,这是通过引入PSS填充来解决的。因此,一般来说,您应该期望签名算法创建难以与随机区分的签名。

您可以通过删除new Random().NextBytes(data);语句自行尝试,即使没有它,结果也应该不同。请注意,如果基础随机数被破坏,则可以从ECDSA签名计算私钥{。{3}}。