C# RSA.SignHash SHA512和SHA256提供相同的签名长度

C# RSA.SignHash SHA512和SHA256提供相同的签名长度,c#,hash,cryptography,rsa,C#,Hash,Cryptography,Rsa,奇怪,但代码的签名数组长度相同: using (RSA rsa = certifiateToUse.GetRSAPrivateKey()) { byte[] bytesData = Encoding.UTF8.GetBytes(input); byte[] hash512 = rsa.SignHash(bytesData, HashAlgorithmName.SHA512, RSASignaturePadding.Pss); byte[] hash256 = rsa.Si

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

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字节。

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

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

由于两个哈希值都小于RSA块大小,因此需要将它们填充到该大小。而且因为它们是填充的,结果签名的大小将是相同的,而不管所使用的哈希算法是什么


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

谢谢Jonathon,这很有意义。在将4096证书替换为2048之后,签名大小更改为256。2048因此具有更小的块大小。奇怪的是,如果没有实际使用,SignHash会使用HashAlgorithmName。使用了hash算法,并生成了不同大小的hash。但是在签名之前,这些散列会被填充到RSA块大小,明白了。刚刚检查了HashAlgorithmName.SHA512和HashAlgorithmName.SHA256的速度,每个操作1000次。似乎SHA512更快了一点。@jonathon reinhart如果使用Curve25519密钥(较小的ECC)而不是大的RSA密钥,这个答案会有什么变化?