Perlモジュールで暗号化 - Crypt::Blowfish_PP編
これまでの暗号化は、すべて不可逆式の暗号化のための関数やモジュールを紹介してきました。つまり、一度暗号化してしまうと、元の文字列には戻せない方式でした。
そこで今回は、暗号文字を元に戻すことのできる「可逆式」の暗号処理について解説してみます。
可逆式の暗号方式で有名なアルゴリズムの1つに、Blowfishがあります。 Blowfishは、1993年に開発された対称ブロック暗号です。
ブロック長は64ビット、鍵長は32ビットから448ビットまでの可変式です。
ちなみに、ブロック暗号(block cipher)とは、データを一定の長さのブロックごとに区切り、ブロック単位で暗号化を行う方式のことです。 入力がたった1bitの変化でも出力が大きく変わるため、暗号文から元の平文を類推されにくいという特性があります。 また、これに対して、ビット単位やバイト単位で処理を行う暗号を「ストリーム暗号(stream cipher)」と呼びます。
方式 特徴
ブロック暗号 データを一定の長さのブロックごとに区切り、ブロック単位で暗号化を行う。
暗号文から元の平文を類推されにくい。
DES, IDEA, RC5等
ストリーム暗号 平文の1桁毎に順次暗号化して行く方式。
処理がシンプルで高速。
RC4, A5, SEAL等

9-1. デモ

Crypt::Blowfish_PPのデモです。文字列をBlowfish形式で変換します。
暗証キー 秘密鍵
pagetop

9-2. Crypt::Blowfish_PPモジュール

Crypt::Blowfish_PPモジュールは、PerlでBlowfish暗号アルゴリズムを利用するためのものです。
同様なモジュールに、Crypt::Blowfishがありますが、基本部分がC言語でコーディングされており、インストールに若干難易性がある等のため、そのPurePerl版(すべてが純粋なPerlでコーディングされている)として Crypt::Blowfish_PPがあります。
モジュール 言語 特徴
Crypt::Blowfish C + Perl インストールに若干難易性あり
処理が高速
Crypt::Blowfish_PP Perl インストールは平易
処理が若干遅い
Crypt::Blowfish_PPモジュールは、通常は Crypt::CBCモジュールと併用して使用します。
Crypt::CBCモジュールは、DES/IDEA/Blowfish/Blowfish_PP の4種類の暗号化方式を取り扱うための補完モジュールです。
使い方としては、Crypt::CBCモジュールでの利用方法を理解しておきます。
概 要 (cpanより)
use Crypt::CBC;
$cipher = Crypt::CBC->new(
				-key    => 'my secret key',
				-cipher => 'Blowfish'
			);

$ciphertext = $cipher->encrypt("This data is hush hush");
$plaintext  = $cipher->decrypt($ciphertext);

$cipher->start('encrypting');
open(F,"./BIG_FILE");
while (read(F,$buffer,1024)) {
	print $cipher->crypt($buffer);
}
print $cipher->finish;

# do-it-yourself mode -- specify key, initialization vector yourself
$key    = Crypt::CBC->random_bytes(8);  # assuming a 8-byte block cipher
$iv     = Crypt::CBC->random_bytes(8);
$cipher = Crypt::CBC->new(
							-literal_key => 1,
							-key         => $key,
							-iv          => $iv,
							-header      => 'none',
						);

$ciphertext = $cipher->encrypt("This data is hush hush");
$plaintext  = $cipher->decrypt($ciphertext);

# RANDOMIV-compatible mode
$cipher = Crypt::CBC->new(
							-key         => 'Super Secret!',
							-header      => 'randomiv',
						);
ちなみに、Crypt::Blowfish_PP も Crypt::CBC も標準モジュールではないため、個別にインストールする必要があります。
ご参考 : 【コラム】Perlモジュールの組み込み
それから、「可逆式」の暗号化の場合は、秘密鍵を決めておく必要があります。 この秘密鍵は、復号のために必要なものです。
pagetop

9-3. 暗号と復号

暗号化のコード例は次のとおりです。
Crypt::CBCモジュールを使って、Blowfish_PPを呼び出し、暗号化します。
ちなみに、new()メソッドのオプションの -paddingは、平文の最後のブロックがブロックサイズよりも短いときの埋め合わせ方法です。 暗号化対象がテキストの場合は「null」か「space」を指定します。
use strict;

# モジュールを宣言
use Crypt::CBC;

# パスワード
my $passwd = 'password';

# 秘密鍵
my $key = 'secret_key';

# オブジェクト定義
my $cbc = Crypt::CBC->new(
		-key     => $key,           # 秘密鍵
		-cipher  => 'Blowfish_PP',  # 暗号方式(モジュール)を定義
		-padding => 'null',         # パディング(テキストの場合)
	);

# 暗号化
my $crypt = $cbc->encrypt_hex($passwd);
print "$crypt\n";
>  53616c7465645f5f3fe984ca8a80b90e6a8bacfe020297a0
次に、復号方法は次のとおりです。
use strict;

# モジュールを宣言
use Crypt::CBC;

# 暗号文字
my $crypt = '53616c7465645f5f3fe984ca8a80b90e6a8bacfe020297a0';

# 秘密鍵
my $key = 'secret_key';

# オブジェクト定義
my $cbc = Crypt::CBC->new(
		-key     => $key,           # 秘密鍵
		-cipher  => 'Blowfish_PP',  # 暗号方式(モジュール)を定義
		-padding => 'null',         # パディング(テキストの場合)
	);

# 復号
my $plain = $cbc->decrypt_hex($crypt);
print "$plain\n";
>  password
pagetop