【问题标题】:Why does ECDSA produce different signatures for the same data, whereas RSA doesn't?为什么 ECDSA 会为相同的数据生成不同的签名,而 RSA 不会?
【发布时间】:2021-08-27 21:36:43
【问题描述】:

考虑以下使用 RSA 的代码...

示例:

byte[] raw = Encoding.Default.GetBytes("Hello, World!");
RSA key = RSA.Create();

for (int index = 0; index < 5; index++)
{
    byte[] signed = key.SignData(raw, HashAlgorithmType.SHA256, RSASignaturePadding.Pkcs1);
    string hashed = signed.ToSha256String();
    Console.WriteLine(hashed);
}

输出:

043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89

现在考虑相同的代码,除了使用 ECDSA...

示例:

byte[] raw = Encoding.Default.GetBytes("Hello, World!");
ECDsa key = ECDsa.Create();

for (int index = 0; index < 5; index++)
{
    byte[] signed = key.SignData(raw, HashAlgorithmType.SHA256);
    string hashed = signed.ToSha256String();
    Console.WriteLine(hashed);
}

输出:

043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89 a31fe9656fc8d3a459e623dc8204e6d0268f8df56d734dac3ca3262edb5db883 a871c47a7f48a12b38a994e48a9659fab5d6376f3dbce37559bcb617efe8662d d7ef0a04f3c8055644677299a9414a75adcb15916eb48417416c9317ace2ff4f 779f5dd63960abda52a7da70464b92eedd47f84a8dffda2d672e6a99de1bab95

我期望的 RSA 的签名输出; ECDSA的,我没有。为什么 ECDSA 会为相同的数据生成不同的签名?

【问题讨论】:

  • 带有 PKCs#1 v1.5 填充的 RSA 是确定性的,即使用相同的输入参数生成相同的签名。如果您使用 PSS 作为填充,则情况并非如此。 ECDSA 通常不是确定性的,即为相同的输入参数生成不同的签名。但是,ECDSA 还有一个确定性变体,.NET 不支持开箱即用,但 C#/BouncyCastle 不支持,参见例如here.
  • 以@Topaco 的观点为基础,如果您想要椭圆曲线上的确定性签名,请使用 EdDSA。

标签: c# cryptography rsa signing ecdsa


【解决方案1】:

Elliptic Curve Digital Signature Algorithm (ECDSA) 是对经典 DSA 算法的改编,依赖于加密安全的random number generator。例如:ECDSA 签名算法计算消息的哈希值,然后生成一个随机整数k 并计算签名(一对整数 {R, S} )。 Rk 计算得出,S 由消息哈希 + 私钥 + 随机数 k 计算得出。因此,由于随机性,签名是非确定性

您可以尝试使用椭圆曲线here

【讨论】:

    【解决方案2】:

    ECDSA 的签名由 R 和 S 的组合组成,其中 R 是输入到 ECDSA 算法中的随机值,而 S 取决于该值。如果 R 是静态值,那么它会allow an attacker to calculate the private key (!)(阅读文章:实际随机值称为 k,R 是通过使用 k 与基点相乘来计算的)。

    使用 PKCS#1 v1.5 填充的签名生成是确定性的这一事实使得它变得奇怪。实际上,带有 PSS 填充的 RSA 是使用显式盐随机化的,因此确定性行为与 RSA 没有任何关系;您甚至可以说它是一个不需要的属性,因为它确实会公开有关已签名的消息/数据的信息(向验证者以外的其他方)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 2014-04-11
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      相关资源
      最近更新 更多