Michael: Java nach PHP

Beitrag lesen

Hallo Mario,

OK, jetzt ist mir Slyh schon zuvor gekommen, aber so ausführlich hätte
ich dir auch nicht antworten können.
Nichts desto trotz hier noch mein Post:

vielen Dank für Deine Mühen. Deine Infos haben die anderen Antworten nochmal super ergänzt und mir sehr weitergeholfen.

Du hast es eigentlich schon recht erkannt. Der übergebene String wird
bitweise verschlüsselt und anschließend hexadezimale dem StringBuffer
angefügt.

Nur wie ganau das abläuft verstehe ich leider immer noch nicht.

Ich habe das mal in einen Debugger gepackt. Vielleicht helfen Dir ja
die erzeugten Werte der Parameter ein wenig weiter:

Auf alle Fälle tun sie das!

Variable          Wert
-------------------|----------------
input-Wert:         testeintrag1
input.getBytes()    [116, 101, 115, 116, 101, 105, 110, 116, 114, 97, 103, 49]
md5Bytes            [-4, 58, -36, -114, 32, -24, 53, -40, -104, 84, -71, -14, 81, 88, -88, 44, 43, 6, 52, -104]
hexValue.toString()  *fc3adc8e20e835d89854b9f25158a82c2b063498

Was ich nicht nachvollziehen kann ist, der SHA-Algorithmus nun auf die Abfolge der Bytes (im Bsp. hier 116, 101, 115, etc.) angewendet wird und mit was genau dann der Array byte[] md5Bytes gefüllt wird.
Mir ist auch nicht ganz klar, wie diese Bytefolge (116, etc.) an die sha-funktion übergeben wird.

Hier mal ein PHP Bsp. dazu:

$bytetest = '1';
$bytetest = ord($bytetest);
echo 'zu 1 wird der byte-wert '.$bytetest.' zurückgeliefert.'; //-> also 49, wie auch oben im Debug

Ab hier fangen dann leider schon die Probleme wieder an, denn wenn ich $bytetest='11' an ord() übergebe, ist das Ergebnis nicht 49, 49 sondern 49.
Wenn ich nun '11' char für char in ein Array schreibe also zb:

$arr = array($bytetest, $bytetest);

komme ich dem was input.getBytes() macht scheinbar etwas näher.

var_dump($arr); liefert dann:
array(2) { [0]=>int(49) [1]=>int(49)}

Und hier gehen dann die Fragen richtig los.

Ist "int(49)" hier gleichbedeutend mit dem byte-wert von '1', also 49 aus dem Debug-Output oben?

Wäre dann ein entsprechender Array auch gleich zu der byte-Folge wie sie getBytes() liefert?

Und wie kann/muss ich das dann in PHP an die SHA-Funktion übergeben?

  • SHA($arr) geht z.B. schon mal nicht.

Um das ganze nun nach PHP zu konvertieren, muss man sich mal schlau machen
was bzw. wie PHP in dieser Sache etwas zu Verfügung stellt.
Über eine php.net-Suche nach SHA gelangt man u.a. zu folgender SHA-Funktionsreferenz.

Berechnet den SHA1 Hash von str unter Verwendung des US Secure
  Hash Algorithmus 1  und gibt den Hashwert zurück. Der Hash ist
  ein 40 Zeichen langer Hexadezimalwert. Ist der optionale Parameter
  raw_output TRUE, wird der SHA1-Extrakt im Raw-Binary-Format mit
  einer Länge von 20 Zeichen zurückgegeben. <<

Über die Referenz von PHP.net bin ich auch schon gestolpert, nur hat das nicht wirklich weitergeholfen da in PHP SHA1('testeintrag1') was anderes erzeugt, als diese Java-Methode.

usw. usf...
Denke, das wirst Du schon rausbekommen..

Die Hoffnung stirbt zuletzt.

BTW: SHA-1 wurde bereits anfang des Jahres geknackt.
http://www.heise.de/newsticker/meldung/56428

Netter Hinweis, aber eine echte Gefährdung ist da ja noch nicht abzusehen.

Wäre schön wenn Du die Funktion dann hier posten würdest ;)

Wenn ich es irgendwann rausbekomme... ;-)

Danke und viele Grüße

Michael