# Javaimplementierung des MD5 Algorithmus



## screamo (29. Feb 2008)

Hallo,
ich versuche gerade die Hashfunktion MD5 in Java umzusetzen, bekomme es jedoch nicht ganz hin.
habe mir schon eine Pseudocode besorgt, den ich jetzt versuche in Java zu übersetzen.
Vielleicht hat ja jemand von euch das schon gemacht und kann mir behilflich sein oder sogar den Code posten.
Toll wäre auch eine leicht verständliche Erklärung zu jedem Schritt.
Besten Dank schonmal!
Hier meine bisherige Arbeit:


```
import java.math.*;
import java.util.*;
import java.lang.Number;
// Beachte: Alle Variablen sind vorzeichenlose 32 Bit-Werte und
// verhalten sich bei Berechnungen kongruent modulo 2^32

class MD5 {
 
  String zMessage;
   
public void ausführen(String pMessage){
 
    pMessage = zMessage;
   
 
  // Definiere r wie folgt:
   int[] r = {

         7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,
         5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,
         4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,
         6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21
    };
 
  int[] t = {
    0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a,
    0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
    0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340,
    0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,
    0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8,
    0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
    0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa,
    0xd4ef3085, 0x4881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
    0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92,
    0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
    0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
 
  // Initialisiere die Variablen:
   int h0 = 0x67452301;
   int h1 = 0xEFCDAB89;
   int h2 = 0x98BADCFE;
   int h3 = 0x10325476;

  // Verwende den binären Vorkommateil vom 2^32-fachen Betrag des Sinus
  // von Integerwerten als Konstanten:
      for( int i=0; i<=63; i++){
        t[i] =(int)(Math.floor(Math.abs(Math.sin(i +1)) * 4294967296));
      }

 

  // Vorbereitung der Nachricht 'zMessage':
  byte [] text ={};
  text=zMessage.getBytes();
  Message msg = new Message(text);
  if(!text = 448 % 512)
  while (! text = 448 % 512){
    text +1;}
 
   
 

  // Verarbeite die Nachricht in aufeinander folgenden 512-Bit Blöcken:
  für alle 512-Bit Block von message
      unterteile Block in 16 32-bit little-endian Worte w(i), 0 ≤ i ≤ 15

      // Initialisiere den Hash-Wert für diesen Block:
      var int a = h0
      var int b = h1
      var int c = h2
      var int d = h3

      // Hauptschleife:
      für alle i von 0 bis 63
          wenn 0 ≤ i ≤ 15 dann
              f = (b and c) or ((not b) and d)
              g = i
          sonst wenn 16 ≤ i ≤ 31 dann
              f = (d and b) or ((not d) and c)
              g = (5×i + 1) mod 16
          sonst wenn 32 ≤ i ≤ 47 dann
              f = b xor c xor d
              g = (3×i + 5) mod 16
          sonst wenn 48 ≤ i ≤ 63 dann
         

        c xor (b or (not d))
              g := (7×i) mod 16
          wenn_ende
   
          temp = d
          d = c
          c = b
          b = ((a + f + k(i) + w(g)) leftrotate r(i)) + b
          a = temp

      // Addiere den Hash-Wert des Blocks zur Summe der vorherigen Hashes:
      h0 = h0 + a
      h1 = h1 + b
      h2 = h2 + c
      h3 = h3 + d

  var int digest = h0 append h1 append h2 append h3 //(Darstellung als little-endian)

}

}

// QUELLEN
//http://www.latenightlecture.de/fileadmin/vortrage/jonas/20051201/Md5.pdf
//http://de.wikipedia.org/wiki/Message-Digest_Algorithm_5
//Schild, Herbert & O'Neil "Java 2 GE-PACKT"
```


----------



## J.C. (29. Feb 2008)

Was ist dass denn? ^^

Wäre nicht schlecht wenn du sagen würdest was du machen willst. Hab echt keine Ahnung...

MD5 verschlüsselung in Java geht so:


```
MessageDigest MD5 = MessageDigest.getInstance("MD5");
byte[] MD5mdDigest = MD5md.digest("ZuverschlüsselnderString".getBytes());
```

Das Byte Array liefert den MD5 Wert für den String


MfG, J.C.


----------



## screamo (29. Feb 2008)

also ich möchte selber die md5 verschlüsselung implementieren.

also nicht schon die vorgefertigten funktionen von java benutzen um die verschlüsselung an zu wenden.


----------

