为什么这些SHA1实现都不一样?

时间:2016-06-01 19:59:12

标签: php r encoding cryptography sha1

我的问题很简单 - 使用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

我可能希望这两个产生相同的输出,但它们没有。

2 个答案:

答案 0 :(得分:4)

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

  

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

     

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

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

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

答案 1 :(得分:1)

是的,这正是具有哈希函数的关键。如果每个人都可以实现相同的算法并且具有不同的结果,那么这个哈希会有多大用处?

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

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

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