Crypt_RSAパッケージによる任意長の鍵を用いた暗号化
Crypt_RSAパッケージは双方向の暗号化をサポートし、RSAブロック暗号を基盤としています。Crypt_RSAでは任意長の鍵を使った暗号化と復号を行うことができます。最新バージョンは1.0.0(安定版)です。インストール方法は、他のPEARパッケージと同様です。
> pear install pear_package_name
Crypt_RSAでは精緻な数値計算を行います。次のエクステンションのうち1つを使用します。
- PECL big_intエクステンション(バージョン1.0.3以上が必要)
- PHP GMPエクステンション
- PHP4/PHP5用のPHP BCMathエクステンション(libbcmathがPHP 4.0.4にバンドルされたため必要)
このパッケージを使用した例を次に示します。
<?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 />'); ?>
ここまで見てきた多様な暗号化オプションを幅広く用いれば、希望することはほとんどすべて実現できるはずです。暗号化は、セキュリティにおけるデリケートな問題です。そしてこの記事からも分かるように、ソリューションや実装は数多くあります。この記事の情報はあくまで入門レベルのことなので、そこから先は、実際のセキュアシステムで得た知識と経験に基づいて、セキュリティ、速度、実装時間の面で最適なバランスが取れた暗号化技術の実装を選ぶようにしてください。
