MD5 funktioniert nicht korrekt !?

Hallo,

ich möchte mit Java MD5-Hashs berechnen. Ich benutze derweilen folgenden Code:
Java:
	public static String md5 (String str) {
		String ret = "";
		
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(str.getBytes());
			byte[] bytes = md.digest();
			
			for (int i=0; i<bytes.length; i++) {
				String tmp = Integer.toHexString((bytes[i] & 0xFF));
				ret += (tmp.length() == 1 ? "0" : "") + tmp;
			}
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
		return ret;
	}

Hat bis jetzt immer funktioniert. Aber: Wenn ich mit dieser Funktionen den folgenden String hashe kommt was anderes raus, als wie, wenn ich es mit der PHP-Funktion md5() mache:
Java:
		char[] chars = {
				(char) 0x00,
				(char) 0x00,
				(char) 0x08,
				(char) 0xf8,
				(char) 0x02,
				(char) 0xbb,
				(char) 0xf8,
				(char) 0x01,
				(char) 0xf8,
				(char) 0x01,
				(char) 0x9c
		};
		String str = new String(chars);

Mit der Java-Funktionen kommt "5a58d7f3adffbb72f1cc3a2b73035130" raus. Mit PHP kommt "3a51926ffccb22364b85baa3bf3f0d4c".

Also erstmal: Warum kommt was unterschiedliches raus, weil wenn ich z.B. "hallo" oder so hashe, funktioniert es.

Dann dachte ich, nochmal nachggooglen. Dabei bin ich auf Viele Dinge - Fotografie, Computer und mehr » MD5-Summen mit Java richtig erstellen gestoßen, wo erklärt wird, wie man das in Java "richtig" macht. Das habe ich auch versucht; ohne Erfolg.

Also, wie mache ich es richtig?


Danke
kaeseohnekaese
 
Ich hab mal den String in PHP in eine Datei geschrieben und diese dann mit Java ausgelesen. Das funktioniert. Aber wo ist dann der Fehler im obigen Code?

Danke
kaeseohnekaese
 
Echt?

Bei mir kommt 9fae664263c99e61134a4c36fae3701f raus.

Hier mein Code

Java:
	public static void main(String[] args) {
		char[] chars = {(char) 0x00, (char) 0x00, (char) 0x08, (char) 0xf8,
				(char) 0x02, (char) 0xbb, (char) 0xf8, (char) 0x01,
				(char) 0xf8, (char) 0x01, (char) 0x9c};
		String str = new String(chars);

		String encrypt = encrypt(str, "MD5");
		System.out.println(encrypt);
	}

	public static String encrypt(String plaintext, String algorithm) {
		MessageDigest md = null;

		try {
			md = MessageDigest.getInstance(algorithm);
			md.update(plaintext.getBytes("UTF-8"));
		} catch (UnsupportedEncodingException e) {
			return null;
		} catch (NoSuchAlgorithmException e) {
			return null;
		}
		return new BigInteger(1, md.digest()).toString(16);
	}
 
Also dass es bei dir "9fae664263c99e61134a4c36fae3701f" raus kommt, liegt daran dass du
Java:
md.update(plaintext.getBytes("UTF-8"));
geschrieben hast. Außerdem steht doch auf der Seite, dass die Methode mit BigInteger nur dann funktioniert, wenn das erste Byte größer als 15 ist, sonst fehlt eine null am Anfang.
 
ähm ... also ich finde es eher sub-optimal hier einen string zu nutzen wenn man ein byte-array hat was bytes unter 0x20 enthält ...

arbeite lieber dierekt mit nem byte-array ... das sollte besser hinhauen
 
Danke! Funktioniert mit dem Byte-Array funktioniert es jetzt auch mit bytes unter 0x20. Aber noch eine Frage: Wenn ich Bytes größer 127 speicher gibt das negative Werte. Dazu eine Frage: Liegt das dran, weil dann das erste Bit von links 1 ist, und dieses dann besagt, dass das Byte negativ ist? Und meine zweite Frage dazu: Gibt es eine bessere Lösung ein Byte in eine Zahl zwischen 0 und 255 umzuwandeln als: ((256 + mein_byte) % 256) ?

Danke
kaeseohnekaese
 
Liegt das dran, weil dann das erste Bit von links 1 ist, und dieses dann besagt, dass das Byte negativ ist?
Ja.
Code:
01111111
ist
Code:
127
als Zweierkomplement.
Code:
10000000
ist
Code:
-128
,
Code:
11111111
ist
Code:
-1
.

Gibt es eine bessere Lösung ein Byte in eine Zahl zwischen 0 und 255 umzuwandeln als: ((256 + mein_byte) % 256) ?
Code:
mein_byte & Byte.MAX_VALUE
Oft wird
Code:
0xFF
statt
Code:
Byte.MAX_VALUE
geschrieben.
 
Code:
mein_byte & Byte.MAX_VALUE
Oft wird
Code:
0xFF
statt
Code:
Byte.MAX_VALUE
geschrieben.

Also wenn ich
Code:
mein_byte & Byte.MAX_VALUE
mache funktioniert das nicht. Wenn ich
Code:
Byte.MAX_VALUE
ausgebe kommt 127 raus. Mit
Code:
mein_byte & 0xFF
gehts aber!
 
Also wenn ich
Code:
mein_byte & Byte.MAX_VALUE
mache funktioniert das nicht. Wenn ich
Code:
Byte.MAX_VALUE
ausgebe kommt 127 raus. Mit
Code:
mein_byte & 0xFF
gehts aber!
Der Grund ist: bei
Code:
mein_byte & Byte.MAX_VALUE
sind beide Operanden von Typ [JAPI]Byte[/JAPI], weshalb auch das Ergebnis von Typ [JAPI]Byte[/JAPI] (also mit Bit 7 als Vorzeichen) ist.
Bei
Code:
mein_byte & 0xFF
ist der zweite Operand ein [JAPI]int[/JAPI] und somit das Ergebnis auch dann positiv, wenn Bit 7 in
Code:
mein_byte
1 ist.

bye
TT
 
Tatsache, das war Quatsch. Da wird das mit
Code:
0xFF
umso klarer. Bei meinem Test hatte ich leider die falsche Variable ausgeben lassen. 🙁
 

Neue Themen


Zurück
Oben