2012-08-27 12 views
5

Deseo calcular hashes de archivos MD5 (u otros) (RFC 1321 conform) dentro de MATLAB utilizando Java-Security-Implementations. Así codifiquéCálculo de hash MD5 (RFC 1321 conformes) en Matlab a través de 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,[]) 

y la rutina funciona bien. De alguna manera, el resultado difiere de las herramientas dadas.
¿Tal vez hay problemas con la codificación de archivos? ¿No debería MATLAB resolver eso internamente?
Me gustaría reproducir los resultados, uno obtiene por md5sum (en Linux), que son iguales a los de HashCalc (Windows).

Respuesta

6

Hay dos problemas:

  1. usted no lee el archivo.
  2. Tiene que transponer la matriz antes de darle nueva forma.

Este código funciona:

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

/\ Editar: p.vitzliputzli respondieron a un very much faster solution que debe ser usado en lugar de éste.

+1

¿No te has perdido un par de noticias? –

+0

Hola @ TobiasRitzau y Stéphane Pinchaux, lo siento mucho, me tomó tanto tiempo. El código de Yout funciona bien, gracias. Feliz Navidad. –

+0

obtengo un "algoritmo" variable indefinido o una clase "algorithm.digest". ¿Hay un prefijo antes de algorithm.digest que necesito agregar? ¿O debería ser "mddigest.digest" en lugar de "algorithm.digest"? – Eagle

2

Nunca read from the DigestInputStream.

Esto significa que no se digieren bytes.

Usted debe leer todo el archivo (a través de la DigestInputStream) y luego llamada digest para obtener el valor de resumen.

+0

Oh, gracias Joachim - esto es necesario. Pero, además, como anoté, me gustaría construir file-hasher conforme a RFC1321, por lo tanto, con un relleno de un bit y más cero y después de agregar 64 bits de longitud. ¿Hay alguna forma de llevar eso a la corriente a mano? –

2

La solución de Stephane funciona pero es bastante lenta debido a la limitación de MATLAB de no poder suministrar un conjunto de bytes JAVA [] al método de lectura de DigestInputStream (o cualquier otro InputStream).

Sin embargo, podemos adaptar de Thomas Pornin solution (descartando el FileInputStream) con el fin de llegar 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,[]); 

Esta solución tiene sobre 0.018s para calcular el hash de un archivo de 713KB mientras que la otra solución tarda aproximadamente 31s.