RSA.SignHash SHA512 和 SHA256 给出相同的签名长度

Posted

技术标签:

【中文标题】RSA.SignHash SHA512 和 SHA256 给出相同的签名长度【英文标题】:RSA.SignHash SHA512 and SHA256 give the same signature length 【发布时间】:2018-12-12 09:50:39 【问题描述】:

奇怪,但代码的签名数组长度相同:

using (RSA rsa = certifiateToUse.GetRSAPrivateKey())

    byte[] bytesData = Encoding.UTF8.GetBytes(input);
    byte[] hash512 = rsa.SignHash(bytesData, HashAlgorithmName.SHA512, RSASignaturePadding.Pss);
    byte[] hash256 = rsa.SignHash(bytesData, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);

hash512 和 hash256 的数组长度都是 512。我找不到一个合理的答案。也许我错过了一些明显的东西?我预计它的长度分别为 512 和 256 个字节。

【问题讨论】:

【参考方案1】:

SHA-256 和 SHA-512 分别产生 256 位和 512 位哈希值。

您的 RSA 密钥是 1024 位或 2048 位,将其用作密码时的块大小是相同的。

由于两个哈希值都小于 RSA 块大小,因此需要将它们填充到那个大小。而且因为它们是填充的,所以无论使用何种哈希算法,生成的签名都将是相同的大小

这里的线索是最后一个参数,它指定了填充算法。

【讨论】:

感谢 Jonathon,这很有道理。将 4096 证书替换为 2048 后,因此具有更小的块大小,签名大小更改为 256。奇怪的是,如果 SignHash 在实际不使用时采用 HashAlgorithmName。 使用散列算法,产生不同大小的散列。但是这些生成的哈希值会在签名之前填充到 RSA 块大小。 知道了。刚刚检查了 HashAlgorithmName.SHA512 与 HashAlgorithmName.SHA256 的速度,分别执行 1000 次操作。似乎 SHA512 甚至更快。 @jonathon-reinhart 如果使用 Curve25519 密钥(较小的 ECC)而不是大型 RSA 密钥,这个答案会有什么变化?

以上是关于RSA.SignHash SHA512 和 SHA256 给出相同的签名长度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?

PHP 之sha256 sha512封装

PHP 之sha256 sha512封装

Openldap 支持 sha256 和 sha512 密码格式

信息摘要算法之四:SHA512算法分析与实现

CryptoJS 和 Closure 中的 SHA512 不一样