5

Java-Security-Implementationsを使用して、MATLAB内でMD5(またはその他の)ファイルハッシュ( RFC 1321準拠)を計算したいと思います。したがって、私はコーディングしました

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

ルーチンは正常に機能しています。どういうわけか、結果は与えられたツールとは異なります。
たぶん、ファイルのエンコードに問題がありますか?MATLABはそれを内部的に解決すべきではありませんか?
結果を再現したいと思います。md5sum(Linuxの場合)で取得します。これは、HashCalc(Windows)の結果と同じです。

4

3 に答える 3

6

2つの問題があります:

  1. あなたはファイルを読みません。
  2. マトリックスを再形成する前に、マトリックスを転置する必要があります。

このコードは機能します:

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

/!\編集:p.vitzliputzliは、これの代わりに使用する必要がある非常に高速なソリューションに回答しました。

于 2012-10-31T12:18:30.443 に答える
3

Stephaneのソリューションは機能しますが、DigestInputStream(またはその他のInputStream)のreadメソッドにJAVA byte []配列を提供できないというMATLABの制限により、非常に低速です。

ただし、以下に到達するために、Thomas Porninのソリューション(FileInputStreamを破棄)を適応させることができます。

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

このソリューションは、713kBファイルのハッシュを計算するのに約0.018秒かかりますが、他のソリューションは約31秒かかります。

于 2016-11-08T10:00:11.103 に答える
2

から読むDigestInputStreamことはありません。

これは、バイトがダイジェストされないことを意味します。

DigestInputStream(を介して)ファイル全体を読み取り、呼び出しdigestてダイジェスト値を取得する必要があります。

于 2012-08-27T10:54:48.183 に答える