2012-08-27 2 views
5

Ich möchte MD5 (oder andere) Datei Hashes (RFC 1321 konform) in MATLAB mit den Java-Security-Implementierungen berechnen. So codierte ichBerechnung von MD5 Hash (RFC 1321 konform) in Matlab über Java

mddigest=java.security.MessageDigest.getInstance('MD5'); 
filestream=java.io.FileInputStream(java.io.File(filename)); 
digestream=java.security.DigestInputStream(filestream,mddigest); 
md5hash=reshape(dec2hex(typecast(mddigest.digest,'uint8')),1,[]) 

und die Routine funktioniert gut. Irgendwie unterscheidet sich das Ergebnis von bestimmten Tools.
Vielleicht gibt es Probleme mit der Dateicodierung? Sollte MATLAB das nicht intern lösen?
Ich würde gerne die Ergebnisse reproduzieren, bekommt man von md5sum (unter Linux), die denen von HashCalc (Windows) entsprechen.

Antwort

6

Es gibt zwei Probleme:

  1. Sie die Datei nicht lesen.
  2. Sie müssen die Matrix transponieren, bevor Sie sie umformen.

Dieser Code funktioniert:

mddigest = java.security.MessageDigest.getInstance('MD5'); 
filestream = java.io.FileInputStream(java.io.File(filename)); 
digestream = java.security.DigestInputStream(filestream,mddigest); 

while(digestream.read() ~= -1) end 

md5hash=reshape(dec2hex(typecast(mddigest.digest(),'uint8'))',1,[]); 

/\ bearbeiten: p.vitzliputzli ein very much faster solution beantwortet, die anstelle dieser einen verwendet werden soll.

+1

Haben Sie nicht ein paar Neuigkeiten verpasst? –

+0

Hi @TobiasRitzau und Stéphane Pinchaux, es tut mir sehr leid, dass es so lange gedauert hat. Yout Code funktioniert gut - danke. Fröhliche Weihnachten. –

+0

Ich bekomme Undefinierte Variable "Algorithmus" oder Klasse "algorithm.digest". Gibt es vor algorithm.digest ein Präfix, das ich hinzufügen muss? Oder sollte es "mddigest.digest" statt "algorithm.digest" sein? – Eagle

2

Sie nie read from the DigestInputStream.

Dies bedeutet, dass keine Bytes verdaut werden.

Sie müssen die gesamte Datei lesen (über die DigestInputStream) und dann Aufruf digest den Digest-Wert zu erhalten.

+0

Oh, danke Joachim - das ist nötig. Aber weiter, wie ich es notiert habe, möchte ich Datei-Hasher konform zu RFC1321, also mit einem Ein-Bit- und weiterem Nullen-Padding und danach 64 Bit-Länge hinzufügen. Gibt es eine Möglichkeit, das per Hand in den Stream zu bekommen? –

2

Die Lösung von Stephane funktioniert, ist aber ziemlich langsam, da MATLAB nur begrenzt in der Lage ist, ein JAVA byte [] -Array an die read-Methode des DigestInputStream (oder eines anderen InputStream) zu liefern.

Wir können aber Thomas Pornin die solution (Verwerfen des Fileinputstream) zu kommen, um sich anpassen an:

mddigest = java.security.MessageDigest.getInstance('MD5'); 

bufsize = 8192; 

fid = fopen(filename); 

while ~feof(fid) 
    [currData,len] = fread(fid, bufsize, '*uint8');  
    if ~isempty(currData) 
     mddigest.update(currData, 0, len); 
    end 
end 

fclose(fid); 

hash = reshape(dec2hex(typecast(mddigest.digest(),'uint8'))',1,[]); 

Diese Lösung über 0.018s führt den Hash einer 713kB-Datei zu berechnen, während die andere Lösung zu nimmt 31s.