2012-08-27 9 views
5

Desidero calcolare MD5 (o altri) hash di file (RFC 1321 conformi) in MATLAB utilizzando Java-Security-Implementations. Così ho codificatoCalcolo di MD5 Hash (conforme RFC 1321) in Matlab tramite 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,[]) 

e la routine sta funzionando bene. In qualche modo, il risultato differisce dagli strumenti forniti.
Forse ci sono problemi con la codifica dei file? Non dovrebbe risolvere MATLAB internamente?
Mi piacerebbe riprodurre i risultati, uno ottenuto da md5sum (su linux), che è uguale a quelli di HashCalc (Windows).

risposta

6

ci sono due problemi:

  1. non si legge il file.
  2. È necessario trasporre la matrice prima di ridisegnarla.

Questo codice funziona:

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,[]); 

/\ Edit: p.vitzliputzli risposto a una very much faster solution che dovrebbe essere usato al posto di questo.

+1

Non ti sei perso un paio di notizie? –

+0

Ciao @TobiasRitzau e Stéphane Pinchaux, mi dispiace molto, che ci è voluto tanto tempo. Il codice Yout funziona bene - grazie. Buon Natale. –

+0

ottengo "algoritmo" variabile non definito o "algoritm.digest" di classe. C'è un prefisso prima dell'algoritmo.digest che devo aggiungere? O dovrebbe essere "mddigest.digest" invece di "algorithm.digest"? – Eagle

2

Non si è mai read from the DigestInputStream.

Ciò significa che nessun byte verrà digerito.

È necessario leggere l'intero file (attraverso il DigestInputStream) e poi chiamata digest per ottenere il valore digest.

+0

Oh, grazie Joachim - questo è necessario. Ma più ulteriormente, come ho annotato in giù, mi piacerebbe costruire file-hasher conforme a RFC1321, quindi con un un bit e un'ulteriore padding di zero e poi aggiungere 64 bit di lunghezza. C'è un modo per farlo entrare nel flusso a mano? –

2

La soluzione di Stephane funziona ma è piuttosto lenta a causa del limite di MATLAB di non essere in grado di fornire una matrice di byte [] JAVA al metodo di lettura di DigestInputStream (o qualsiasi altro InputStream).

Tuttavia, siamo in grado di adattarsi di Thomas Pornin solution (scartando il FileInputStream) al fine di giungere a:

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,[]); 

Questa soluzione richiede circa 0.018s per calcolare l'hash di un file di 713KB, mentre l'altra soluzione è di circa 31s.