Perlモジュールで暗号化 - サムチェック編
暗号化から少し離れますが、Digest::MD5を使ったサムチェックの方法を解説しておきます。
6-1. サムチェックとは
サムチェックとは、データを送受信する際の検出方法の1つです。
具体的には、たとえばダウンロードさせるファイルが、オリジナルのものか否かをチェックしたり、あるいは複数ある画像・動画ファイルから同一のものを検出したりする際に利用します。つまり、バイナリファイルの同一性をチェックする際に有効なものです。
つまり、MD5方式に変換することでユニークな値を得て、同一か否かを判別する訳です。
具体的には、たとえばダウンロードさせるファイルが、オリジナルのものか否かをチェックしたり、あるいは複数ある画像・動画ファイルから同一のものを検出したりする際に利用します。つまり、バイナリファイルの同一性をチェックする際に有効なものです。
つまり、MD5方式に変換することでユニークな値を得て、同一か否かを判別する訳です。
ここでは、複数ある画像の中から同一のものを検出するコード例を考えてみます。
例えば、以下にそれぞれファイル名の異なる4つの画像ファイルがあります。今回はこの中から、同一の画像を探し出します。 まあ、以下のような4つ程度ならば、人間の「目」で見ればすぐに分かりますが、1万個の中から探し出すとすると、やはりプログラムの力を借りる他ありません。
例えば、以下にそれぞれファイル名の異なる4つの画像ファイルがあります。今回はこの中から、同一の画像を探し出します。 まあ、以下のような4つ程度ならば、人間の「目」で見ればすぐに分かりますが、1万個の中から探し出すとすると、やはりプログラムの力を借りる他ありません。
| dog1.gif | dog2.gif | dog3.gif | dog4.gif |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
上記の画像ファイルをそれぞれDigest::MD5で文字列化し、同一のものを探しだすコードを考えてみます。
最初に、まず画像ファイルをDigest::MD5で文字列化する方法です。
このような場合は、OO方式を使用します。
このような場合は、OO方式を使用します。
use strict; # モジュール宣言 use Digest::MD5; # 画像ファイル my $file = 'dog1.gif'; # データ読み込み open(IN,"$file"); binmode(IN); # MD5変換 my $digest = Digest::MD5->new->addfile(*IN)->hexdigest; close(IN); # 出力 print "$digest : $file\n";
> d2094ae7f078a7d3159066e023607acc : dog1.gif
上記ように、dog1.gifという画像ファイル(バイナリファイル)をMD5方式で表現することができました。
6-2. 同一画像を検出する
それでは、同一画像を検出するコード例です。
全体の画像ファイルを順次読み込みながら、各MD5値を取得し、同一の要素のものだけを表示するプログラムを書いてみましょう。
全体の画像ファイルを順次読み込みながら、各MD5値を取得し、同一の要素のものだけを表示するプログラムを書いてみましょう。
use strict;
# モジュール宣言
use Digest::MD5;
# 対象画像ファイル
my @file = qw(dog1.gif dog2.gif dog3.gif dog4.gif);
# 各画像ファイルを読み込み
my (%file,%uniq);
for (@file) {
# 画像を読む
open(IN,"$_") or die;
binmode(IN);
my $digest = Digest::MD5->new->addfile(*IN)->hexdigest;
close(IN);
# MD5値が重複するもの
if (defined($file{$digest})) { $uniq{$digest}++; }
# MD5値に対するファイル名を覚えておく
$file{$digest} .= "$_,";
}
# 重複したものを展開
for ( keys %uniq ) {
print "$_ : $file{$_}\n";
}
> d2094ae7f078a7d3159066e023607acc : dog1.gif,dog4.gif,
上記のコードを実行することで、do1.gif と dog4.gif が同一画像であることが分かりました。
Cryptography in Perl

powered by
Profile





