エントリー

PHPで可逆暗号化

PHPでは mcrypt_generic() を使えば可逆暗号化ができ、mdecrypt_generic() で復号化できます。…が、使い方がちょっとややこしかったのでメモ。関連する関数を色々と呼び出す必要があります。

具体的には、以下のコードで暗号化ができます。

<?php

//暗号化するデータ
$plain_text = 'これは秘密のメッセージです。';

//暗号化&復号化キー
$key = md5('KQAHGOEUXD');

//暗号化モジュール使用開始
$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.');
}

//データを暗号化
$crypt_text = base64_encode(mcrypt_generic($td, $plain_text));

//暗号化モジュール使用終了
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

//結果を表示
echo "<!DOCTYPE html>\n";
echo "<html lang=\"ja\">\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\" />\n";
echo "<title>暗号化テスト</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>暗号化テスト</h1>\n";
echo "<dl>\n";
echo "<dt>暗号化前</dt><dd>" . $plain_text . "</dd>";
echo "<dt>暗号化後</dt><dd>" . $crypt_text . "</dd>";
echo "</dl>\n";
echo "</body>\n";
echo "</html>\n";

?>

この場合、これは秘密のメッセージです。 という文字が暗号化されます。KQAHGOEUXD は、暗号化と復号化に使うパスワードのようなものです。この値を知っている人だけが、このデータを復号化できます。

実行すると、以下のように暗号化前の文字と暗号化後の文字が表示されます。

暗号化テスト

暗号化前
  これは秘密のメッセージです。
暗号化後
  eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi

復号化は以下のようにします。

<?php

//復号化するデータ
$crypt_text = 'eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi';

//暗号化&復号化キー
$key = md5('KQAHGOEUXD');

//暗号化モジュール使用開始
$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.');
}

//データを復号化
$plain_text = mdecrypt_generic($td, base64_decode($crypt_text));

//暗号化モジュール使用終了
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

//結果を表示
echo "<!DOCTYPE html>\n";
echo "<html lang=\"ja\">\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\" />\n";
echo "<title>復号化テスト</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>復号化テスト</h1>\n";
echo "<dl>\n";
echo "<dt>復号化前</dt><dd>" . $crypt_text . "</dd>";
echo "<dt>復号化後</dt><dd>" . $plain_text . "</dd>";
echo "</dl>\n";
echo "</body>\n";
echo "</html>\n";

?>

eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi は、先のコードで暗号化した文字列です。KQAHGOEUXD は、暗号化したときと同じ値を指定します。

実行すると、以下のように表示されます。

復号化テスト

復号化前
eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi
復号化後
これは秘密のメッセージです。

ページ移動

ユーティリティ

カテゴリー

検索

エントリー検索フォーム
キーワード

過去ログ

過去ログ表示フォーム
キーワード

Feed