SHA1编码为十六进制有40个字符和160位

时间:2014-10-18 16:23:01

标签: encryption encoding openssl sha1

SHA1摘要应为160位长。它通常表示为一个包含40个字符的字符串。考虑到8位字节,1个字符对应1个字节,在我看来,SHA1摘要应该有20个字节,它的十六进制表示为40个字节。

例如,使用OpenSSL我可以获得以下结果(在手动删除添加的额外信息后):

PLAIN MESSAGE:唯一可能的革命就在我们内心

openssl dgst -sha1 -hex dgsttxt &> sha1_hex

32 64 66 61 33 35 66 62 35 37 34 65 36 62 65 36 32 33 62 37 63 36 31 61 63 61 32 63 61 31 65 66 39 30 36 62 39 63 38 34

openssl dgst -sha1 -binary dgsttxt &> sha1_binary
2D FA 35 FB 57 4E 6B E6 23 B7 C6 1A CA 2C A1 EF 90 6B 9C 84

在每个文件中应用wc

wc sha1_binary sha1_hex 
 0  1 20 sha1_binary
 0  1 40 sha1_hex
 0  2 60 total

所以我有两个问题:

  1. 为什么十六进制转储中还有20个字符?
  2. 如何插入这些额外的位?我可以注意到十六进制转储中的每个字节都以 3 6 开头。这有什么特别的原因吗?
  3. 我已经看到了类似的问题here,但我不确定我是否太愚蠢,无法理解答案,或者他们是否真的很穷。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

160位/ 8 = 20字节;十六进制的字节是2个字符(00FF)和2 * 20 = 40个十六进制字符。

较长的输出是十六进制编码散列的十六进制编码版本。

这是什么意思,谁知道。

var s = "32 64 66 61 33 35 66 62 35 37 34 65 36 62 65 36 32 33 62 37 63 36 31 61 63 61 32 63 61 31 65 66 39 30 36 62 39 63 38 34".split(" ");

for (var i = 0; i < s.length; i++)
{
    document.write( String.fromCharCode(parseInt(s[i], 16)) );
}