Delphiを使いこなせ!(2)

Delphiで、MD5の値を計算する手っ取り早い方法はないかと、探してみた。できれば、ユニットになっていてすぐに使えるのがいい。Cからの移植なども考えたが、すでにあるものを再利用させていただくのが常道である。

MD5とはMessage Digest 5の略で、連続したデータ列に対してダイジェスト(digest)を作成するひとつの仕様である。ダイジェストとはハッシュ(hash)とも呼ばれる。ダイジェストおよびハッシュの特徴は、与えられたデータに対して、常に一定長の、限りなく重複のゼロなパターンを返すことにある。用途としては、たとえばあるファイルの内容に信憑性があるものかどうか、ファイルの作成者が公開したダイジェストと、実際に入手したファイルのダイジェストを比較し、一致すればよろしいとするといったことが挙げられる。

MD5は、RFC1231で標準化されているもので、もっとも広く使われている。ほかには、SHA-1(Secure Hash Algorithm 1)などがある。ダイジェストと言われるとおり、オリジナルのデータを元にパターンを作り出すだけなので、元のデータを復元することはできない。そういう意味では、暗号化とは異なるものとして扱われる。

MD5を計算して画面に表示したり、ファイルに書き出すツールは多く存在する。最もシンプルなものでは、md5sumが有名である。UNIX系、Windows系で動くものがそれぞれ用意されている。ただしコマンドラインインタフェースなので注意。私にはこういう方が使いやすい。Windows版の注意点は、-bオプションを与えてバイナリモードでダイジェストを計算させることだろうか。しばらく、これではまってしまった。

前振りが長くなったが、もっとも使いやすいと思われるユニットを見つけることができた。MarleySoftさんのMD5計算ユニットmd5.pasである。バイト列およびファイルからMD5値を計算する関数が入っており、ユニットをuseする宣言を入れるだけで使える。

use MD5;

const filename = ‘test.txt’;
const original = ‘716383fe746ae78378’;    // 適当(md5sumなどで調べたものを入れておく)

var digest: String;

digest := CalcFileMD5( filename );
if CompareStr( digest, original ) <> 0 then
    ShowMessage( ‘Bad!!’ );

こんな感じだ。

配布や使用に関してはご自由にとのことだ。ありがたい話である。

コメント