【问题标题】:Why aren't these SHA1 implementations alike?为什么这些 SHA1 实现不一样?
【发布时间】:2016-10-01 08:33:00
【问题描述】:

我的问题很简单——使用 2 个独立的 SHA1 实现,我是否保证对于相同的输入获得相同的输出,或者在实现中是否有解释空间?

最具体地说,我的 R 摘要 SHA1 实现和我的 PHP Sha1 摘要似乎并没有像我希望的那样结合在一起。是我有错误还是 SHA1 实现只是提供同一消息的不同有效哈希?

在 R 中:

digest_token = "Stackoverflow is Cool"
value = digest(digest_token, "sha1", raw=FALSE)

输出:

[1] 4c 70 99 2f 81 b5 32 0d 77 aa 17 b6 da be 69 92 13 a0 44 9f

在 PHP 中

$digest_token= "Stackoverflow is Cool";
$value = sha1($disgest_token, false); 

输出

ef48c200b5d9b844c950f7704e6c03359f8a4e2f

我可能希望这两个产生相同的输出,但事实并非如此。

【问题讨论】:

  • 不,一些实现被破坏了。
  • 假设一个有效的实现。
  • 如果你假设一个有效的实现,那么你的问题没有意义。你刚刚回答了你自己的问题。你问的是编码吗?
  • 关于您的编辑:这可能是编码问题。如果 PHP 或 R 的实现被破坏,那就太奇怪了。
  • 如果在修复变量错误后运行此代码,我会在 PHP 中得到 fda997e6a74fb411555490995b262310bab74458。也许你应该确保你在这里显示了正确的字符串。

标签: php r encoding cryptography sha1


【解决方案1】:

R digest package description 非常清楚发生了什么(强调我的):

digest 函数将加密哈希函数应用于任意 R 对象。 默认情况下, 对象是内部序列化的,并且是当前实现的 MD5 和 SHA-1 哈希之一 函数算法可用于计算序列化对象的紧凑摘要。

为了与其他实现比较,输入参数的序列化也可以 关闭,其中输入参数必须是返回其摘要的字符串。

以下代码产生与 PHP 代码相同的结果:

digest_token = "Stackoverflow is Cool"
value = digest(digest_token, "sha1", raw=FALSE, serialize=FALSE)

【讨论】:

    【解决方案2】:

    是的,这正是哈希函数的意义所在。如果每个人都可以实现相同的算法并得到不同的结果,那么这个哈希值会有多大用处?

    该算法初始化一些变量,然后执行大量预定义的确定性“位改组”。虽然理论上你仍然可以通过更改这个初始化变量来获得 SHA1 逻辑,但没有人这样做。

    你可以看到这些variables here(这只是我能找到的算法的实现之一)。

    digest[0] = 0x67452301;
    digest[1] = 0xefcdab89;
    digest[2] = 0x98badcfe;
    digest[3] = 0x10325476;
    digest[4] = 0xc3d2e1f0;
    

    【讨论】:

    • 对不起忍者编辑了这个问题,但我想我真正的问题是为什么这两个 SHA1 哈希不相似?
    • @gbtimmon 那么你应该从一开始就很清楚。您最初的 2 行问题类似于:“所有 sha1 实现都产生相同的结果”。我的问题完美地回答了这个问题。我无法猜到您在 R 和 php 实现方面遇到了问题。
    • 嗯,我的理解随着我的前进而不断发展。
    • @gbtimmon,我无法猜到你的进化会发生在哪轮,什么时候会停止:-)
    • 唉,我也没有
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多