Genaue Funktionsweise von MessageDigest

Don83

Bekanntes Mitglied
Hallo,
ich versuche mich gerade noch ein wenig mein Wissen zur Kryptographie und die Umsetzung in java zu vertiefen.

Also mal angenommen wir haben einen String.

Wenn ich nun diesen String einwegverschlüsseln will kann ich verschiedene Algorithmen verwenden wie z.B. den SHA-256. Dieser erzeugt nun mathematisch eine Zahl mit 256 bits.
Ist es legitim dass man solche bits als Zahlen interpretiert? Also z.B. 001110 einfach als 1110 zu interpretieren? Nunja erstmal weiter.
Im nächsten Schritt (in java über message digest umgesetzt) zerschnibble ich dann diese 256 bits in jeweils 8er Stückchen(bytes) und kann dann diese bytes die echte Zahlen darstellen in Zeichenketten umwandeln(Integer.toHexString).Diese haben die Form fffff123.

Final hängt man die Strings dann zusammen und "entfernt" die "f"s.Der Endwert ist der "HashWert".

So mich interessiert nun ob ich das ganze richtig verstanden habe und vorallem verstehe ich eine Sache noch nicht. Ich habe einen Algorithmus gefunden der mit Hashfunktionen arbeitet.

Hier mal die Formel die mich interessiert:
gi(x) = (h1(x) + ih2(x)) mod l

h1 und h2 sind hashfunktionen. Nun verstehe ich nicht, was hier eigentlich addiert werden soll. Etwa die bits? Also z.B. 100101010010101010111 + 10101010110101010111. Hierzu muss ich dann aber auch sagen, dass ich noch keine Möglichkeit gefunden habe wie man sich den bit-String der SHA-Verschlüsselung ausgeben lässt.
Grundsätzlich mache ich einwegverschlüsselungen eben auf die folgende Art:

Java:
MessageDigest md;
String string1 ="Hallo";
		
md= MessageDigest.getInstance("SHA-256");
          
md.update(string1.getBytes());
 byte[] mb = md.digest();
 String output = "";
for (int i = 0; i < mb.length; i++) {
   byte temp = mb[i];
   System.out.println(temp);
   String s = Integer.toHexString(new Byte(temp));
   System.out.println(s);
   while (s.length() < 2) {
      s = "0" + s;
    }
     s = s.substring(s.length() - 2);
     output += s;
}
//System.out.println(out.length());
System.out.println("Hashwert von "+ string1+ ": " + output);
// gi(x) = (h1(x) + ih2(x)) mod bloomFilterSize

Nunja, wie gesagt, besonders interressieren tut mich hier natürlich wie ich die Ergebnisse der zwei hashwerte addieren kann bzw. hierzu eine Modulo Rechnung durchführe. Das ganze verwirrt mich etwas.
 

Kevin94

Top Contributor
Also erstmal ist das byte-Array, das du zurückbekommst schon dein fertiger hash, du must also nichst daran rummurksen und irgendwelches 'f' entfernen. Java kennt keine primitiven Datentypen (genauso wie jede andere Sprache) mit mehr als 64-bit, deswegen kriegst du den Hash-Wert als Array zurück. Damit du in Java mit solchen Zahlen rechnen kannst gibt es die Klassen java.math.BigInteger (für Ganzzahlen) und java.math.BigDecimal (für Kommazahlen). Diese Klasse bietet auch die Möglichkeit, sich solche Zahlen dirket als String ausgeben zu lassen.
Auserdem brauchst du die update Methode nicht, wenn du die Daten in einem Block hast. Dein Code würde unter Verwendung von BigInteger so aussehen:
Java:
MessageDigest md;
String string1 ="Hallo";
        
md= MessageDigest.getInstance("SHA-256");
          
byte[] hashBytes = md.digest(string1.getBytes());
BigInteger hash=new BigInteger(hashBytes);
String hashString= hash.toString(16);//für Hex-String bzw 2 für Binär-String
//System.out.println(hashString.length());
System.out.println("Hashwert von "+ string1+ ": " + hashString);

und die Rechnung, wobei hash1, hash2 und bloomFilterSize BigInteger sind:

Java:
// gi(x) = (h1(x) + ih2(x)) mod bloomFilterSize
BigInteger gi=hash1.add(hash2).mod(bloomFilterSize);
 
Zuletzt bearbeitet:

Don83

Bekanntes Mitglied
Hallo,

vielen Dank für die Hilfe. Ich habe nun allerdings eine Frage zu BigInteger. Wie kann ich mit BigInteger ein Array Initialisieren? Bzw. geht das überhaupt? Wenn ich folgenden code verwende bekomme ich die Meldung
Type mismatch: cannot convert from int to BigInteger

Java:
BigInteger bloomFilterSize = 50;
String[] bloomFilter = new String[bloomFilterSize];

EDIT: oben stehendes hat sich erledigt:
Java:
int bloomFilterSize = 50;
BigInteger bigBloomFilterSize = new BigInteger(Integer.toString(bloomFilterSize));
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben