SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

PHP暗号化ガイド

デフォルト関数と外部ライブラリを利用した暗号化

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ユーザーはこちらでそれぞれダウンロードできます。

著者注
 PHP 5.0.0を使用している場合は、libmcrypt Version 2.5.6以上も必要となります。

 Libmcryptのインストール手順は次のとおりです。

  1. libmcrypt.dllをダウンロードします。
  2. libmcrypt.dllファイルを、{php_home}/extと{Windows_home}/System32にコピーします。
  3. php.ini内のextension=php_mcrypt.dllという行のコメント記号(;)を削除し、この行を有効にします。
  4. 更新したphp.iniファイルを保存します。
著者注
 Linuxの場合は、libmcrypt-x.x.tar.gzファイルをダウンロードし、同梱されているインストール指示に従ってください。

 MCryptでは、CBC、OFB、CFB、ECBの4つの暗号モードを使用できます。libmcrypt-2.4.x以上を使用しているのであれば、MCrypt関数はnOFBおよびSTREAM暗号モードでも動作します。表2に、一般的に利用される暗号モードと、それぞれいつ使用するかを簡単に示します。

表2 MCryptのよく使用される暗号モード
暗号利用モード説明
MCRYPT_MODE_ECBランダムデータに使用します。各種の鍵の暗号化に利用できます。
MCRYPT_MODE_CBCファイル暗号化に使用します。
MCRYPT_MODE_CFBバイトストリームの暗号化に適しています。
MCRYPT_MODE_OFB特に、エラー伝播が許されないアプリケーションで使用されます。
MCRYPT_MODE_NOFBOFBと同様ですが、より安全性が高いものです。
MCRYPT_MODE_STREAMWAKEや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);  
   } 
   
?>  

次のページ
MHashによるハッシュの作成

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Octavia Andreea Anghel(Octavia Andreea Anghel)

経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2628 2008/06/30 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー