【问题标题】:SHA1 encoding to hex has 40 characters and 160 bitsSHA1 编码为十六进制有 40 个字符和 160 位
【发布时间】:2014-12-14 00:50:56
【问题描述】:

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

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

简单的信息:唯一可能的革命就在我们内心

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. 这些额外的位是如何插入的?我可以注意到十六进制转储中的每个字节都以 36 开头。有什么特别的原因吗?

我已经看到了一个类似的问题here,但我不确定我是否太愚蠢而无法理解答案,或者他们是否真的很差。任何帮助表示赞赏。

【问题讨论】:

    标签: encryption encoding openssl sha1


    【解决方案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)) );
    }

    【讨论】:

    • 所以当我得到 2D FA 35 FB 57 4E 6B E6 23 B7 C6 1A CA 2C A1 EF 90 6B 9C 84 实际上有 20*2 = 40 个十六进制数字时会发生这种情况。现在怎么变成 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 = 80 十六进制,对吧?
    • 哦,现在事情变得更清楚了!仍然为什么 OpenSSL 会使用这种双十六进制编码作为默认选项?这似乎毫无意义,不是吗?非常感谢您提供的示例,它非常有帮助。
    • 我在这里放了一个婴儿步骤回答类似问题:stackoverflow.com/a/45178066/5552415
    猜你喜欢
    • 2013-06-16
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2020-06-15
    • 2011-05-18
    • 1970-01-01
    • 2019-07-27
    相关资源
    最近更新 更多