MCryptを用いた大規模データの暗号化
MCryptを使用すると、開発者はさまざまな暗号化関数を用いてファイルやデータストリームを暗号化できます。暗号に関する専門知識は必要ありません。MCryptは、Blowfish、DES、TripleDES、SAFER-SK128、TWOFISH、TEA、RC2、3-WAY、SAFER-SK64などのブロックアルゴリズムと、いくつかの「利用モード」(modes of operation)に幅広く対応しています。通常、MCryptなどのブロック暗号は、多くは64または128ビットの固定長データブロックを取り扱います。しかし、メッセージはどんな長さにもなりうることと、同じプレーンテキストを同じ鍵で暗号化すると常に同じ結果となることから、任意長のメッセージにもブロック暗号を適用できるようにする解決策がいくつか考え出されてきました。こうした解決策は、ブロック暗号の利用モードとして知られています。MCryptがサポートするモードには、CBC、CFB、CTR、ECB、OFB、NCFBがあります。
MCryptの付随ライブラリにLibmcryptというものがあり、実際の暗号化関数はこちらのライブラリに含まれています。Windowsユーザーはこちらで、Linuxユーザーはこちらでそれぞれダウンロードできます。
Libmcryptのインストール手順は次のとおりです。
- libmcrypt.dllをダウンロードします。
- libmcrypt.dllファイルを、{php_home}/extと{Windows_home}/System32にコピーします。
- php.ini内のextension=php_mcrypt.dllという行のコメント記号(
;)を削除し、この行を有効にします。 - 更新したphp.iniファイルを保存します。
MCryptでは、CBC、OFB、CFB、ECBの4つの暗号モードを使用できます。libmcrypt-2.4.x以上を使用しているのであれば、MCrypt関数はnOFBおよびSTREAM暗号モードでも動作します。表2に、一般的に利用される暗号モードと、それぞれいつ使用するかを簡単に示します。
| 暗号利用モード | 説明 |
| MCRYPT_MODE_ECB | ランダムデータに使用します。各種の鍵の暗号化に利用できます。 |
| MCRYPT_MODE_CBC | ファイル暗号化に使用します。 |
| MCRYPT_MODE_CFB | バイトストリームの暗号化に適しています。 |
| MCRYPT_MODE_OFB | 特に、エラー伝播が許されないアプリケーションで使用されます。 |
| MCRYPT_MODE_NOFB | OFBと同様ですが、より安全性が高いものです。 |
| MCRYPT_MODE_STREAM | WAKEやRC4などのストリームアルゴリズムが必要な場合に使用します。 |
表2の暗号モードに加え、MCryptでは現在次の暗号もサポートされています。
- MCRYPT_3DES
- MCRYPT_ARCFOUR
- MCRYPT_BLOWFISH
- MCRYPT_ENIGMA
- MCRYPT_GOST
- MCRYPT_IDEA(有償)
- MCRYPT_LOKI97
- MCRYPT_MARS
- MCRYPT_PANAMA
- MCRYPT_RIJNDAEL_128
MCryptの例
それでは、MCryptを使用してテキストファイルの内容を暗号化および復号化する方法を実際の例で見ていきましょう。先ほどの例と同じように、textfile.txtの内容を暗号化し、その結果をencrypted.txtファイルに格納します。ただし今回の例では、さらに続けてencrypted.txtファイルを復号し、暗号解除されたテキストをnewfile.txtファイルに格納します。
// Listing file_encrypt.php <?php $file = 'textfile.txt'; $initial_contents = file_get_contents($file); if($initial_contents){ //This function opens the module of the algorithm and //the mode to be used $td = mcrypt_module_open('tripledes', '', 'ecb', ''); //Create an initialization vector (IV) from a random source $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); //This function initializes all buffers needed for encryption mcrypt_generic_init($td, $initial_contents, $iv); //This function encrypts data $encrypted_data = mcrypt_generic($td, $initial_contents); $encrypted_file = @fopen('encrypted.txt','w'); $ok_encrypt = @fwrite($encrypted_file,$encrypted_data); if($ok_encrypt){ echo 'The encrypted code was succesfully created '. 'in encrypted_file.txt!!!'.'<br />'; } else{ echo ("The write of this file failed!"); } @fclose($encrypted_file); mcrypt_generic_init($td, $initial_contents, $iv); //This function decrypts data $p_t = mdecrypt_generic($td, $encrypted_data); $newfile = @fopen('newfile.txt','w'); $ok_decrypt = @fwrite($newfile,$p_t); if($ok_decrypt){ echo 'The decrypted code was succesfully created '. 'in newfile.txt!!!'.'<br />'; } else{ echo ("The write of this file failed!"); } @fclose($newfile); //This function deinitializes an encryption module mcrypt_generic_deinit($td); //Close the mcrypt module mcrypt_module_close($td); } ?>
