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 中的旧上下文进行哈希处理?我没有找到任何关于如何做到这一点的文档,我也不确定哪里出了问题。

将不胜感激任何关于如何解决这个问题的评论!

4

1 回答 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;
于 2013-10-21T15:42:44.007 回答