SHA512 算法的哈希值是 128 位长吗?

Posted

技术标签:

【中文标题】SHA512 算法的哈希值是 128 位长吗?【英文标题】:Hashvalue from SHA512 algorithm is 128 bits long? 【发布时间】:2013-02-22 15:04:43 【问题描述】:

我有一个奇怪的问题。 在我的代码中,我创建了一个 sha512 哈希算法并用它签署了一些数据。 现在我希望散列的长度为 512 位,但实际上是 128。 我犯了什么错误?

我的代码:

var hashAlgorithm = HashAlgorithm.Create( „SHA512“ );
var signedhHash = rsaCryptoServiceProvider.SignData( plainData, hashAlgorithm );

PS。 我已经从使用以下脚本创建的文件中加载了 RSA 密钥:

makecert -r -n "CN=myCert" -sky exchange -sy 24 -sv myCert.pvk myCert.cer
cert2spc myCert.cer myCert.spc
pvk2pfx -pvk myCert.pvk -spc myCert.spc -pfx myCert.pfx –f

编辑:

我从signedhHash.Length得到长度,等于128。

【问题讨论】:

你在哪里计算长度? 计算长度?你的意思是这样的:signedhHash.Length (signedhHash.Length is equals to 128) 你说“它有 128 位长”,你从哪里得到这个数字? 如果你从signedhHash (128 bytes) 得到长度,那么实际上你有1024 bits。你在比较两个不同的东西 【参考方案1】:

哈希值的大小是 512,但 签名的哈希值(来自 SignData)的大小是 1024。

var alg = HashAlgorithm.Create("SHA512");
var hashArr = alg.ComputeHash(ASCIIEncoding.UTF8.GetBytes("test"));
var size = hashArr.Length * 8; //512

var rsaCryptoServiceProvider = new RSACryptoServiceProvider();
var signedValue = rsaCryptoServiceProvider.SignData(ASCIIEncoding.UTF8.GetBytes("test"), alg);
size = signedValue.Length * 8; //1024

(1 字节 = 8 位)

【讨论】:

当我回到页面发布我的答案时,我怎么没看到已经发布了答案 非常感谢!所以这意味着signedhHash.Length总是等于rsaCryptoServiceProvider.KeySize / 8? @SpaceghostAli:当我开始在 OP 上编写我的 cmets 时,我也没有看到这个答案.. Magnus 是魔术师吗?【参考方案2】:

SignData 不返回使用 SHA512 算法生成的散列,它返回使用提供者的 SignatureAlgorithm 属性生成的散列的签名 (http://www.w3.org/2000/09/xmldsig#rsa-sha1)

【讨论】:

以上是关于SHA512 算法的哈希值是 128 位长吗?的主要内容,如果未能解决你的问题,请参考以下文章

1.2常用安全加密

go语言练习:sha256sha512哈希算法

MD5,sha1,sha256分别输出多少位啊?

MD5、sha1、sha256分别输出多少位?

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

哈希算法之md5和sha1