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, trim($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 = trim(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
復号化後
これは秘密のメッセージです。