SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

PHP暗号化ガイド

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

Crypt_RSAパッケージによる任意長の鍵を用いた暗号化

 Crypt_RSAパッケージは双方向の暗号化をサポートし、RSAブロック暗号を基盤としています。Crypt_RSAでは任意長の鍵を使った暗号化と復号を行うことができます。最新バージョンは1.0.0(安定版)です。インストール方法は、他のPEARパッケージと同様です。

> pear install pear_package_name

 Crypt_RSAでは精緻な数値計算を行います。次のエクステンションのうち1つを使用します。

 このパッケージを使用した例を次に示します。

<?php
   
require_once 'Crypt/RSA.php';
   
//Generates the pair keys
function generate_key_pair()
{
   global $public_key,$private_key;
   
   $key_pair = new Crypt_RSA_KeyPair(32);
   
   //Returns public key from the pair
   $public_key = $key_pair->getPublicKey();
   
   //Returns private key from the pair
   $private_key = $key_pair->getPrivateKey();
}
   
//Check runtime errors
function check_error(&$obj)
{
   if ($obj->isError()){
      $error = $obj->getLastError();
      switch ($error->getCode()) {
      case CRYPT_RSA_ERROR_WRONG_TAIL :
         // nothing to do
         break;
      default:
         // echo error message and exit
         echo 'error: ', $error->getMessage();
         exit;
      }
   }
}
      
$file = 'textfile.txt';
   
generate_key_pair();  
$plain_text = file_get_contents($file);
      
//get string represenation of the public key
$key = Crypt_RSA_Key::fromString($public_key->toString()); 
      
$rsa_obj = new Crypt_RSA;
check_error($rsa_obj);
      
//Ecnrypts $plain_text by the key $key.
$encrypted = $rsa_obj->encrypt($plain_text, $key);
      
$encrypted_file = @fopen('encrypted.txt','w');
$ok_encrypt = fwrite($encrypted_file,$encrypted);
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);
      
$enc_text = $encrypted;
     
//Get string represenation of the private key
$key2 = Crypt_RSA_Key::fromString($private_key->toString());
check_error($key2);
      
//Check encrypting/decrypting function's behaviour
$rsa_obj->setParams(array('dec_key' => $key2));
check_error($rsa_obj);
   
//Decrypts $enc_text
$decrypted = $rsa_obj->decrypt($enc_text);
      
$newfile = @fopen('newfile.txt','w');
$ok_decrypt = @fwrite($newfile,$decrypted);
if($ok_decrypt){
   echo 'The decrypted code was succesfully created '.
   'in newfile.txt!!!'.'<br />';
}
else{
    echo ("The write of this file failed!");
}
@fclose($newfile);
    
?>

Crypt_HMACでのハッシュ生成

 Crypt_HMAC PEARパッケージには、RFC 2104準拠のハッシュの算出に使用できるクラスが含まれています。Crypt_HMACの使い方は簡単で、秘密鍵と使用したいハッシュメソッド、そしてプレーンテキストの文字列を与えるだけです。Crypt_HMACではMD5とSHA-1アルゴリズムの両方をサポートしています。最新バージョンの安定版リリースは1.0.0です。インストール方法は他のPEARパッケージと同様です。

> pear install pear_package_name

 Crypt_HMACを使用したハッシュ生成の簡単なサンプルを次に示します。

<?php
      
require_once 'Crypt/HMAC.php';
   
//Creating a key by repeating the "0x0b" character for 20 times 
$key = str_repeat(chr(0x0b), 20);
   
//Creating an instance of the Crypt_HMAC class
//$crypt = new Crypt_HMAC($key, 'md5');
$crypt = new Crypt_HMAC($key, 'md5');
     
//Hashing function
echo $crypt->hash('Hello')."<br />";
   
$key = str_repeat(chr(0xaa), 10);
$data = str_repeat(chr(0xdd), 50);
   
//Sets key to use with hash
$crypt->setKey($key);
echo $crypt->hash($data)."\n";
?>

Crypt_DiffieHellmanパッケージでの秘密鍵の生成

 このPEARパッケージは、Diffie-Hellman鍵交換暗号化プロトコルをPHP5用に実装したものです。このプロトコルを使用して外部の二者のために秘密鍵を生成すると、両者は生成された鍵を使って、安全性の低い経路であっても通信を行えるようになります。最新リリースはバージョン0.2.1(ベータ版)で、他のPEARパッケージと同じ方法でインストールできます。

> pear install pear_package_name

 次に示す2つのサンプルコードは、subject_1とsubject_2の二者間で秘密鍵を生成する2種類のアプリケーションです。最初のサンプルは、Diffie Hellmanアルゴリズムに基づくセキュアな秘密鍵を取得する最も簡単な方法を示しています。

<?php
   
//include Diffie Hellman functions
require_once 'Crypt/DiffieHellman.php';
   
//set the required options for two subjects
$subject_1 = array('prime'=>'123', 'generator'=>'7', 'private'=>'3');
$subject_2 = array('prime'=>'123', 'generator'=>'7', 'private'=>'34');
   
//apply Diffie Hellman algorithm
$subject_1_GK = new Crypt_DiffieHellman(
   $subject_1['prime'], $subject_1['generator'], 
   $subject_1['private']);
$subject_2_GK = new Crypt_DiffieHellman(
   $subject_2['prime'], $subject_2['generator'], 
   $subject_2['private']);
   
//generate keys      
$subject_1_GK->generateKeys();
$subject_2_GK->generateKeys();
   
//compute the secret keys     
$subject_1_SK = $subject_1_GK->computeSecretKey(
   $subject_2_GK->getPublicKey())->getSharedSecretKey();
$subject_2_SK = $subject_2_GK->computeSecretKey(
   $subject_1_GK->getPublicKey())->getSharedSecretKey();
   
//displaying the secret keys      
echo('Subject_1_SK:'.$subject_1_SK.'<br />');
echo('Subject_2_SK:'.$subject_2_SK);
?>      

 2番目のサンプルでは、Diffie HellmanのBINARYモードを使用して秘密鍵を生成しています。

<?php
   
//include Diffie Hellman functions
require_once 'Crypt/DiffieHellman.php';
   
//set the required options for two subjects
$subject_1 = array('prime' => 
   '9568094558049898340935098349053', 
   'generator'=>'2', 
   'private' => '2232370277237628823279273723742872289398723');
$subject_2 = array('prime' => 
   '9568094558049898340935098349053', 
   'generator'=>'2', 
   'private' => '0389237288721323987429834389298232433363463');
   
//apply Diffie Hellman algorithm
$subject_1_GK = new Crypt_DiffieHellman(
   $subject_1['prime'], $subject_1['generator'], 
   $subject_1['private']);
$subject_2_GK = new Crypt_DiffieHellman(
   $subject_2['prime'], $subject_2['generator'], 
   $subject_2['private']);
   
//generate keys    
$subject_1_GK->generateKeys();
$subject_2_GK->generateKeys(); 
   
//compute the secret keys using BINARY mode      
$subject_1_SK = $subject_1_GK->computeSecretKey(
   $subject_2_GK->getPublicKey(Crypt_DiffieHellman::BINARY), 
   Crypt_DiffieHellman::BINARY)->
   getSharedSecretKey(Crypt_DiffieHellman::BINARY);
$subject_2_SK = $subject_2_GK->computeSecretKey(
   $subject_1_GK->getPublicKey(Crypt_DiffieHellman::BINARY), 
   Crypt_DiffieHellman::BINARY)->
   getSharedSecretKey(Crypt_DiffieHellman::BINARY);
   
//display the secret keys    
echo('subject_1_SK:'.$subject_1_SK.'<br />');
echo('subject_2_SK:'.$subject_2_SK.'<br />');
   
?>

 ここまで見てきた多様な暗号化オプションを幅広く用いれば、希望することはほとんどすべて実現できるはずです。暗号化は、セキュリティにおけるデリケートな問題です。そしてこの記事からも分かるように、ソリューションや実装は数多くあります。この記事の情報はあくまで入門レベルのことなので、そこから先は、実際のセキュアシステムで得た知識と経験に基づいて、セキュリティ、速度、実装時間の面で最適なバランスが取れた暗号化技術の実装を選ぶようにしてください。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー