XV. 暗号化関数

ここで示す関数は、mcrypt を 使用して動作します。

この関数は、CBC, OFB, CFB ,ECB 暗号モードの DES,TripleDES,Blowfish (デフォルト),3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 ,GOST の ような広範なブロックアルゴリズムをサポートする mcrypt ライブラリへのインターフェースです。 加えて、"フリーではない" を思われるRC6 および IDEA もサポートします。

これを使用するには、ここ から libmcrypt-x.x.tar.gz をダウンロードし、含まれているインストール用の 指示に従って下さい。この拡張機能を利用可能にするためには、 PHP を --with-mcrypt パラメータを 付けてコンパイルする必要があります。

mcrypt は、上に示した暗号を用いて暗号化および複合化を 行うことが可能です。4つの重要な mcrypt コマンド (mcrypt_cfb, mcrypt_cbc, mcrypt_ecb, mcrypt_ofb) は、 MCRYPT_ENCRYPT および MCRYPT_DECRYPT という 2つのモードの両方で実行可能です。

例 1. 入力値を ECB モードの TripleDES で暗号化する


<?php
$key = "this is a very secret key";
$input = "Let us meet at 9 o'clock at the secret place.";

$encrypted_data = mcrypt_ecb(MCRYPT_TripleDES, $key, $input, MCRYPT_ENCRYPT);
?>
     
この例では、$encrypted_data に文字列として暗号化されたデータが 返されます。

mcrypt は、4つの暗号化モード (CBC, OFB, CFB, ECB) で実行可能です。 ここで、これらの各モードの通常の使用法の概要を示します。 詳細なリファレンスおよび議論に関しては、 Applied Cryptography by Schneier (ISBN 0-471-11709-9) を参照下さい。

  • ECB (electronic codebook) は、他のキーを暗号化するといった ランダムデータに適しています。 出力データは短くランダムであるという ECB の短所は、 都合の良い逆の効果を持っています。

  • CBC (cipher block chaining) は、特に、 ECB よりも著しく高いセキュリティで ファイルを暗号化する用途に適しています。

  • CFB (cipher feedback) は、1バイト毎に暗号化する必要がある バイトストリームを暗号化する際に最も適したモードです。

  • OFB (output feedback) は CFB と互換性がありますが、 エラーの伝播が許容されないアプリケーションに 使用することが可能です。

PHP は、現在ビットストリームの暗号化/複合化をサポートしていません。 現在のところ、PHP は文字列の処理のみをサポートしています。

サポートされる暗号の完全なリストについては、mcrypt.h の define を 参照下さい。 一般に、特定の暗号は、PHP で MCRYPT_暗号名 とすることによりアクセス 可能です。

以下に現在 mcrypt 拡張機能においてサポートされている暗号の簡単なリストを 示します。mcrypt がサポートする暗号がこのリストにのっていない場合、 このドキュメントが古いと仮定して下さい。

  • MCRYPT_BLOWFISH

  • MCRYPT_DES

  • MCRYPT_TripleDES

  • MCRYPT_ThreeWAY

  • MCRYPT_GOST

  • MCRYPT_CRYPT

  • MCRYPT_DES_COMPAT

  • MCRYPT_SAFER64

  • MCRYPT_SAFER128

  • MCRYPT_CAST128

  • MCRYPT_TEAN

  • MCRYPT_RC2

  • MCRYPT_TWOFISH (古い mcrypt 2.x バージョン用)

  • MCRYPT_TWOFISH128 (TWOFISHxxx は最近の 2.x バージョンで利用可能)

  • MCRYPT_TWOFISH192

  • MCRYPT_TWOFISH256

  • MCRYPT_RC6

  • MCRYPT_IDEA

CFB および OFBモードではそれぞれの暗号関数に初期化ベクトル(IV) を与える 必要があり、CBCモードではIVを指定することが可能です。 IV は、ユニークである必要があり、暗号化/複合化の際に同じである 必要があります。 暗号化されて保存されたデータの場合、関数の出力を (ファイル名の MD5 キーのように) 保存されたデータの位置を表す インデックスとして使用することができます。 もしくは、暗号化されたデータと共にIV を渡すことができます。 (このトピックに関する議論については、Applied Cryptography by Schneier (ISBN 0-471-11709-9) の 9.3 章 を参照下さい)

目次
mcrypt_get_cipher_name ? 指定した暗号の名前を得る
mcrypt_get_block_size ? 指定した暗号のブロックサイズを得る
mcrypt_get_key_size ? 指定した暗号のキーの長さを得る
mcrypt_create_iv ? 乱数ソースから初期化ベクトル(IV)を生成する
mcrypt_cbc ? CBC モードでデータを暗号化/複合化する
mcrypt_cfb ? CFB モードでデータを暗号化/複合化する
mcrypt_ecb ? ECB モードでデータを暗号化/複合化する
mcrypt_ofb ? OFB モードでデータを暗号化/複合化する