2013-10-21 3 views
6

CからPHPへのハッシュ機能を実装しようとしていますが、問題が発生しました。これに助けを借りて本当に感謝します。PHPとCのインクリメンタルハッシュ

これは、複数回のハッシュ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で古いコンテキストでハッシュすることができますか?私はこれを行う方法に関するドキュメントを見つけることはできませんし、どこが間違っているのか分かりません。

この問題を解決する方法については、あらゆる種類のコメントに感謝します。

+0

"$ ctx = hash_init( 'sha1');"あなたのループで? – apoq

+0

はい、エラーになり、ハッシュは生成されません:警告:hash_final():4は有効なハッシュコンテキストリソースではありません。 – Ms01

+0

CとPHPの両方に完全なコードを組み込むと、助けが簡単になります。 – whooot

答えて

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; 
+0

コメントが私のためにそれを解決し、私はANを追加しました。 Tyvm :) – Ms01

+0

これは私のためにそれを解決したコードです: http://paste.laravel.com/10Qp – Ms01