Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Java MD5 Hash selber generieren Problem
- Ersteller Homie2009
- Erstellt am
Warum machst du's so Kompliziert ? (oder musst du?)
eigentlich reicht doch das:
und falls es dir hilft:
Hier ist MD5 händisch in JS implementiert: http://aktuell.de.selfhtml.org/artikel/javascript/md5/index.htm
eigentlich reicht doch das:
Code:
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
und falls es dir hilft:
Hier ist MD5 händisch in JS implementiert: http://aktuell.de.selfhtml.org/artikel/javascript/md5/index.htm
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....
Ich hatte damals das selbe Problem. Da hilft einfach nur jeden Berechnungsschritt einzeln auf Papier kurz zu verifizieren....
- Registriert
- März 2009
- Beiträge
- 860
@ 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
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 
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 ?
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:
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.
riDDi
Admiral
- Registriert
- Aug. 2004
- Beiträge
- 7.570
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. ;-)
asdfman
Commander
- Registriert
- März 2008
- Beiträge
- 2.315
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.
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.
- Registriert
- März 2009
- Beiträge
- 860
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!
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.
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.
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.
Ähnliche Themen
- Antworten
- 11
- Aufrufe
- 2.935
- Antworten
- 9
- Aufrufe
- 1.364
A
- Antworten
- 19
- Aufrufe
- 9.030
- Antworten
- 9
- Aufrufe
- 2.050