Fireplace

Java MD5 Hash selber generieren Problem

Homie2009

Lieutenant
Registriert
März 2009
Beiträge
860
falscher Datentyp wurde verwendet :)
 
Zuletzt bearbeitet:
Zuletzt bearbeitet:
Lang ists her, da musst ich das auch mal programmieren. Ich glaube kaum, dass jemand die Zeit dein Programmen zu debuggen. Das fiese am Algorithmus ist ja, dass man erst am Endergebnis sieht, dass es falsch läuft - an welchem Punkt der Berechnung sieht man nicht.

Ich hatte damals das selbe Problem. Da hilft einfach nur jeden Berechnungsschritt einzeln auf Papier kurz zu verifizieren....
 
@ benneque - ich muss den Weg selbst Programmieren

den Link schaue ich mir morgen mal genauer an

@ Banthor - am besten kopiere ich mal die Stellen raus, welche mir die größten Probleme bereiten oder markiere sie farbig
 
Ich denke viele (u.a. ich) haben keine Lust sich die genaue Spezifikation von MD5 anzuschauen :D
also:

Was soll z.B. die "Umdrehen" Funktion genau machen?
Kriegt die irgendeinen int?
Warum wird die Schleife 4x durchlaufen?
Was soll da passieren?


EDIT: übliche Java-Doc Kommentare wären schon toll


EDIT2: noch interessant wäre es Zahlen bzgl. der DB zu bekommen. Wie viele Einträge sind da tatsächlich pro Tabelle enthalten? Also was sind für dich "ganz schön viele"? 1000 oder 100000 ?
 
Zuletzt bearbeitet:
Die Umdrehen Funktion soll die Bytes einer Zahl umdrehen. Da ich die Funktion selber noch nicht so recht nachvollziehen konnte, habe ich sie einfach kopiert und gehofft, dass sie funktioniert
 
Also eine übliche Zahl (32 bit = 4 byte) soll einfach "umgekehrt" werden? Also die ersten 8 bit nach hinten (und das dann 4 mal) ?
 
Homie2009 schrieb:
Die Umdrehen Funktion soll die Bytes einer Zahl umdrehen. Da ich die Funktion selber noch nicht so recht nachvollziehen konnte, habe ich sie einfach kopiert und gehofft, dass sie funktioniert

Für mich sieht die Umdrehfunktion ok aus. Es werden halt die niederwertigsten 4 Byte der Eingabe gespiegelt.

Auch ohne zu wissen, wie die Funktion das macht könntest du ja einfach ein paar Testaufrufe machen und schauen, ob wirklich das richtige Ergebnis bei rauskommt. Dann kannst du das schon einmal abhaken.

Das machst du dann für jeden der Berechnungsschritte, die dir nicht klar sind. Macht dir ein paar Beispiele und schau, ob das erwartete Ergebnis bei rauskommt.

Anders geht es halt nicht.
 
Was mir da direkt auffiele... das Tutorial ist in C# geschrieben, viele Variablen sind vorzeichenlos. In Java sind dagegen alle Zahlentypen vorzeichenbehaftet. Das macht z.B. bei Shifts nach rechts einen Unterschied, weil das Vorzeichen bewahrt wird.
 
CopyOfHash ist m.M.n. in Ordnung, Umdrehen sieht auch gut aus. Merkwürdig ist der Beginn von fuehreAus. Ansich sollte da folgendes passieren: Du setzt an deinen String erst ein Bit 1 und dann eine Menge von Bits 0 dran, bis der String modulo 512 die Länge von 448 bits erreicht. Dann muss noch die länge angehängt werden, wohlgemerkt "umgedreht". Check das mal sauber durch. ;-)
 
Würde vorschlagen, du nimmst dir eine vorhandene Implementierung von MD5, zum Beispiel md5sum aus
den coreutils, oder meine von hier: http://devotchka.vellocet.net/boskop/browser/trunk/src/md5.c

Dann änderst du sie entsprechend, dass Zwischenwerte angezeigt werden (z.B. Ein- und Ausgabe der
Roundfunktion, etcpp) und vergleichst diese mit deiner. Dann müsstest du eigentlich relativ schnell sehen,
wo der Fehler liegt.
 
Das Programm funktioniert jetzt! Die Fehler:
1. Ich habe den normalen Integer verwendet, welcher gar nicht den gleichen Wertebereich abdeckt wie der unsigned int! Also musste ich auf long umstellen, da z.B. die Hexadezimalzahlen negativ anstatt positiv waren

2. Das Array r habe ich falsch gefüllt: ich habe ein neues Array erstellt, und meine fuehreAus-Methode hat auf das ungefüllte Array zugegriffen

3. Bei der stringformatierung der long Werte habe ich einen falschen Parameter genutzt

danke an alle, die sich hier beteiligt haben und mich motiviert haben die Ausgabewerte zu vergleichen!
 
Homie2009 schrieb:
1. Ich habe den normalen Integer verwendet, welcher gar nicht den gleichen Wertebereich abdeckt wie der unsigned int! Also musste ich auf long umstellen, da z.B. die Hexadezimalzahlen negativ anstatt positiv waren

das stimmt so nicht. die zahlendarstellung nennt sich zweierkomplement und macht bei bitweisen operatoren absolut keinen unterschied, ebenso wie bei + und -.
nur multiplikation, division, modulo und shift right (es wird mit dem höchstwertigen bit aufgefüllt) machen da einen unterschied.
 
als ich die Variablen h0, h1, h2 und h3 umgestellt habe auf long, hat sich deren Wert von negativen Zahlen in positive geändert...
 
ob ein wert positiv oder negativ ist hängt in diesem programm nur davon ab wie daraus eine zeichenkette generiert wird. bei java werden alle integer-werte als signed integer interpretiert und folglich ist die zeichenkette eine negative zahl.
bei den genannten rechenoperationen ist es für die interne bit-darstellung der integer-variablen aber völlig egal ob sie als signed oder unsigned angesehen werden.

beispiel:
0xFFFFFFFF

interpretiert als signed integer ist das -1, als unsigned 4294967295. und das bei den exakt gleichen bits!


wie gesagt.. dass java mit signed int arbeitet macht nur bei *, /, %, >> einen unterschied, da dort bei signed integer andere operationen auf der CPU ausgeführt werden. die restlichen operationen ergeben bei signed und unsigned ein identisches ergebnis.
 
Zurück
Oben