2013-10-21 17 views
6

Ich versuche Hash-Funktionalität von C zu PHP zu implementieren, habe aber ein Problem ausgelöst. Würde mich freuen, etwas Hilfe dabei zu bekommen.Inkrementelles Hashing in PHP vs C

Dies ist der C-Code mehrfach Hashing:

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); 

Aber dann wird es gehasht wieder in einer Schleife, und es ist der schwierige Teil für mich in PHP zu implementieren:

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); 
} 

Die SHA1_Init verwendet den gleichen Kontext & ctx in der Schleife. Etwas, vor dem ich Angst habe, kann ich nicht in PHP machen.

Dieser mein aktueller PHP-Code ist:

$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); 
} 

Vom Ausgang, ich kann deutlich sehen, dass in dem zweiten Mal Hashes die Hash ist nicht das gleiche wie in C:

C: 
cf584b11970312e4b973bc7b35870d7e019affcd 
cb1ea097e844363e4e76d512af4245c10ade1725 

PHP: 
cf584b11970312e4b973bc7b35870d7e019affcd 
3003969f9065d7614d7cf34675b9d9bf7584d7c3 

Wie kann ich mit dem alten Kontext in PHP hacken? Ich finde keine Dokumentation darüber, wie das geht, und ich bin mir nicht sicher, wo es falsch läuft.

Wäre dankbar für jede Art Kommentare, wie Sie dieses Problem zu lösen!

+0

Haben Sie versucht, entfernen "$ ctx = hash_init ('sha1');" in deiner Schleife? – apoq

+0

Ja, das wird in einen Fehler aufgelöst und es wird kein Hash erzeugt: Warnung: hash_final(): 4 ist keine gültige Hash Kontext Ressource - sie ist auch auf den Update Funktionen. – Ms01

+0

Es wird einfacher zu helfen, wenn Sie den vollständigen Code für C und PHP enthalten. – whooot

Antwort

2

Dies ist, weil Sie in internen Zyklus in C binary Array (Array von Bytes) verwenden, aber in der PHP-Sie verwenden Zeichenfolge mit hex-Darstellung dieses Array. ich denke, mehr richtig ist:

$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

Dein Kommentar löste es für mich, ich fügte nur ein if hinzu, um zu überprüfen, ob es die letzte Schleife war, dann habe ich kein Binärformat verwendet und das hat es gelöst. Tyvm :) – Ms01

+0

Dies ist der Code, der es für mich gelöst hat: http://paste.laravel.com/10Qp – Ms01