2009-03-03 11 views
0

Ich versuche das zu verstehen, damit ich etwas ähnliches machen kann. Ich weiß:Keine Sha1-Übereinstimmung in meiner C# zu PHP-Code-Konvertierung, was fehlt mir?

buf einen Authentifizierungsschlüssel mit einem Hash, um es (die letzten 20 Bytes) Die HashData beigefügten enthält, die in der MachineKeySection SHA1

length -= 20; 
byte[] buffer2 = MachineKeySection.HashData(buf, null, 0, length); 

for (int i = 0; i < 20; i++) 
{ 
    if (buffer2[i] != buf[length + i]) 
    { 
     return null; 
    } 
} 
nachgeschlagen Sein

Hier ist, was ich denke, geschieht: Wir hashing alle außer den letzten 20 Bytes von buf. Dann werden wir, 1 Byte zu einer Zeit, den Hash, den wir gerade erstellt haben, mit dem Hash vergleichen, der an die letzten 20 Bytes von buf angehängt wird.

Also in PHP Ich versuche dies:

//get the length of the ticket -20 bytes 
$ticketLn = strlen($buf)-40; 
//grab all but the last 20 bytes 
$ticket = substr($decrypthex, 0, $ticketLn); 
//create a hash of the ticket 
$hash = substr($decrypthex, $ticketLn); 

Und der nächste Schritt ist, zu vergleichen. Aber wenn ich die Ausgabe von $ hash und sha1 ($ ticket) zurückgebe, passen sie nicht zusammen, also habe ich mich nicht einmal darum gekümmert, sie im Code zu vergleichen.

Antwort

2

standardmäßig PHP sha1() function kehrt ein 40 Zeichen langer Hexadezimalwert. Sie müssen explizit das 20-Byte-Binärformat anfordern, wenn Sie das wollen

$hash = sha1($ticket, true); 
1
$ticket = substr($decrypthex, 0, -20); 
$hash = substr($decrypthex, -20); 
+0

Danke für die bessere Syntax, aber immer noch nicht, was ich brauche. – lynn