2

我正在尝试使用 ECDSA 和 secp256r1 曲线(P256)和 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 应该包含相同的字节数组,但它们不包含。需要帮忙。

4

1 回答 1

3

问题是 (EC)DSA 算法本身是不确定的——它在内部依赖于一个安全的随机数生成器。因此,您必须等待长时间才能生成相同的签名。

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

您可以通过删除new Random().NextBytes(data);语句自己尝试,即使没有它,每次结果也应该不同。请注意,如果底层随机数被破坏,则可以从 ECDSA 签名中计算出私钥,如 fail0verflow 所示

于 2014-12-14T12:20:25.590 回答