PHP中的增量哈希与C中的增量哈希的比较

6

我想将C语言中的哈希功能实现到PHP中,但遇到了问题。非常感谢能够得到一些帮助。

以下是对多个值进行哈希运算的C代码:

    SHA_CTX ctx;
    SHA1_Init(&ctx);
    SHA1_Update(&ctx, (const u_int8_t *) salt, strlen(salt));
    SHA1_Update(&ctx, (const u_int8_t *) argv[1], strlen(argv[1]));
    SHA1_Final(temp, &ctx);

但是它会在循环中再次进行哈希,这对我来说是实现php的棘手部分:

for (n = 0; n < 2 ; ++n) {
        SHA1_Init(&ctx);
        SHA1_Update(&ctx, (const u_int8_t *)salt, strlen(salt));
        SHA1_Update(&ctx, temp, SHA_DIGEST_LENGTH);
        SHA1_Final(temp, &ctx);
}

SHA1_Init在循环中使用相同的上下文&ctx。我担心在php中无法做到这一点。
这是我的当前php代码:
$ctx = hash_init('sha1');
hash_update($ctx, $salt);
hash_update($ctx, 'string');
$pw = hash_final($ctx);

for ($round = 0; $round < 2; ++$round) {
    $ctx = hash_init('sha1');
    hash_update($ctx, $salt);
    hash_update($ctx, $pw);
    $pw = hash_final($ctx);
}

从输出结果来看,我可以清楚地看到在第二次哈希时,哈希值与C中的不同:

C:
cf584b11970312e4b973bc7b35870d7e019affcd
cb1ea097e844363e4e76d512af4245c10ade1725

PHP:
cf584b11970312e4b973bc7b35870d7e019affcd
3003969f9065d7614d7cf34675b9d9bf7584d7c3

我怎样才能在PHP中使用旧的上下文进行哈希?我没有找到任何关于如何做这个的文档,也不太确定哪里出了问题。

非常感谢任何关于如何解决这个问题的建议!


你试过在循环中删除 "$ctx = hash_init('sha1');" 吗? - apoq
是的,这会导致错误并且没有哈希被生成:警告:hash_final():4不是有效的哈希上下文资源--它也在更新函数中。 - Ms01
如果您包含C和PHP的完整代码,将更容易提供帮助。 - whooot
@whoot 为什么会更容易呢?这就是问题所在,不需要添加很多其他代码。 - Ms01
1个回答

2

这是因为在C二进制数组(字节数组)中使用了内部循环,而在PHP中使用了表示该数组的十六进制字符串。我认为更正确的做法是:

$salt = 'salt';
$ctx = hash_init('sha1');
hash_update($ctx, $salt);
hash_update($ctx, 'string');
$pw = hash_final($ctx, true);
for ($round = 0; $round < 2; ++$round) {
    $ctx = hash_init('sha1');
    hash_update($ctx, $salt);
    hash_update($ctx, $pw);
    $pw = hash_final($ctx, $round < 1);
}
echo $pw;

你的评论解决了我的问题,我只是添加了一个if语句来检查是否是最后一次循环,然后我没有使用二进制格式,这样就解决了。非常感谢 :) - Ms01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接