Perlで復号化してみる
一方向暗号化であるMD5によるエンコードは破れないといいますが、結果のハッシュ値データから逆検索することで解析できます。
意外に以下PHPコードのようなことをして暗号化しているケースが多いためです。
$str = “abcde”;
print “md5 : ” . md5( $str ) . “\n”;Perlだと・・・
#!/usr/bin/perl
use strict;
use Digest::MD5;
my $str = ‘abcde’;
print “md5 : ” . Digest::MD5->new->add(“$str”)->hexdigest . “\n”;
exit;
#!/usr/bin/perl
use strict;
use Digest::MD5 qw/md5_hex/;
my $str = ‘abcde’;
my $md5 = md5_hex( $str );
print ”md5:” . $md5;これで終わりだと、暗号化前後の紐づけが判別しやすいためあまり意味がありません。
キーを元に暗号化するようにします。
暗号化されたデータを類推する方法です。Perlの場合、「Digest MD5 Reverse」というモジュールが出ているので、これを使います。
オンライン上のハッシュデータベースから逆引きで値を探すという仕組みになっています。
#!/usr/local/bin/perl
use strict;
use warnings;
#MD5 (“a”) = 0cc175b9c0f1b6a831c399e269772661
use Digest::MD5::Reverse qw(r_md5_hex);
my $md5 = ‘0cc175b9c0f1b6a831c399e269772661’;
my $text = r_md5_hex ($md5);
print ‘Data is ‘, $text, “\n”;
PHPで復号化してみる
複合化した際に後部に不必要な文字列が入っているのでカットする。
//暗号化&復号化キー
$str = “暗号化テスト”;
$key = md5(‘HF6F4K85’);
//暗号化モジュール使用開始
$td = mcrypt_module_open(‘des’, ”, ‘ecb’, ”);
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
//暗号化モジュール初期化
if (mcrypt_generic_init($td, $key, $iv) < 0) {
exit(‘error.’);
}
//データを暗号化
$enc_str = base64_encode(mcrypt_generic($td, $str));
//データを復号化
$dec_str = mdecrypt_generic($td, base64_decode($enc_str));
$dec_str = rtrim($dec_url); // 余計な文字を消す
//暗号化モジュール使用終了
mcrypt_generic_deinit($td);
mcrypt_module_close($td);