テキストファイルを暗号化する方法

CGIテクニック集トップへ





概要

Blowfishアルゴリズムを使ってテキストファイルを暗号化して保存します。 クリプトページ4クリプトページ5クリプト編集で使われています。 複合化の方法は暗号化ファイルを元のテキストファイルに戻す方法を参照ください。

必用な処理

  1. Crypt::CBCモジュールを読み込む
  2. Crypt::CBCオブジェクトを作成する
  3. 入力ファイルをオープンし、内容を変数に入れる
  4. その変数を暗号化し、結果を変数に入れる
  5. 変数の内容をファイルに書き出す

サンプルコード

 use Crypt::CBC;
 
 my $key = 'MySecretKey';
 
 my $cipher_options = {
        key            => "$key",
        cipher         => 'Blowfish',
        salt           => 1,
 };
 
 my $cipher = Crypt::CBC->new($cipher_options);
 
 my $textfile = 'orgtext.txt'; 
 open (FILE, "< $textfile");
 binmode FILE;
 my $filetext = join '', <FILE>;
 close(FILE);
 
 my $crypttext = $cipher->encrypt($filetext);
 
 my $crfile = 'encrypted.txt';
 open(FILE,"> $crfile");
 binmode FILE;
 print FILE "$crypttext";
 close(FILE);

コードの解説

 use Crypt::CBC;

Crypt::CBCを読み込みます。

 my $key = 'MySecretKey';
 
 my $cipher_options = {
        key            => "$key",
        cipher         => 'Blowfish',
        salt           => 1,
 };

Crypt::CBCのオブジェクトを作成するのにオプションを設定します。Crypt::CBCコンストラクタ(new)に渡すオプションはハッシュのリファレンスで作成します。 $keyに暗号化のキーを設定します。MySecretKeyが暗号化のキーになります。このキーは8文字以上必用です。 chipherにCipherのモードを設定します。ここではBlowfishアルゴリズムを指定します。 slatを1に設定しているので実際のキーとInitialization Vectorを作成するsaltをランダムで作成します。実際のキーは入力されるキーからランダムに作成され、それによって暗号がされます。Initialization Vectorはオプション指定しないのでモジュールが自動的に作成し、暗号化された文字列に埋め込みます。 その他のオプションは指定する必要がないか、デフォルトものまま使います。 その他のオプションについてはhttp://search.cpan.org/~lds/Crypt-CBC-2.22/CBC.pmを参照ください。

 my $cipher = Crypt::CBC->new($cipher_options);

Crypt::CBCのオブジェクトを作成します。先に指定したハッシュのリファレンスを渡します。引数はハッシュのリファレンスなので、

 my %cipher_options = (
        key            => "$key",
        cipher         => 'Blowfish',
        salt           => 1,
 );
 
 my $cipher = Crypt::CBC->new(\%cipher_options);

このようにも記述できますし、

 my $cipher = Crypt::CBC->new({
        key            => "$key",
        cipher         => 'Blowfish',
        salt           => 1,
 });

このようにも記述できます。

 my $textfile = 'orgtext.txt'; 
 open (FILE, "< $textfile");
 binmode FILE;
 my $filetext = join '', <FILE>;
 close(FILE);

元のテキストファイルを変数に入れます。join関数によりファイルハンドル配列で読み込みそれをnullで繋げて一つの文字列にします。配列で読み込むので全てのファイルの内容が一度に読み込まれます。ファイル全体を一つの変数に入れるので大きなファイルになるとそれだけメモリーを消費することになります。また、暗号化する際も大きなファイルにはそれ相応のメモリーが消費されます。巨大なファイルを暗号化するには、巨大なファイルを暗号化する方法を参照ください。

 my $crypttext = $cipher->encrypt($filetext);

encryptメソッドで変数に入った文字列を暗号化します。暗号化された文字列が返り値になりますのでそれを変数に保存します。この返り値もファイルサイズと同等のサイズになります。

 my $crfile = 'encrypted.txt';
 open(FILE,"> $crfile");
 binmode FILE;
 print FILE "$crypttext";
 close(FILE);

暗号化文字列をファイルに書き出します。暗号化後はさまざまの文字が含まれているのでbinmodeで保存しなければいけません。ここではencrypted.txtというファイルが作成されます。

関連するCGIテクニック

暗号化ファイルを元のテキストファイルに戻す方法
巨大なファイルを暗号化する方法
巨大な暗号化されたファイルを複合化する方法