LV. Mcrypt暗号化関数

導入

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

注意: この拡張モジュールはWindows環境 では利用できません。

要件

ここで示す関数は、mcrypt を 使用して動作します。この拡張モジュールを使用するには、ここ からlibmcrypt-x.x.tar.gz をダウン ロードし、含まれているインストール用の指示に従って下さい。

libmcrypt 2.4.xとリンクした場合、加えてブロックアルゴリズム: CAST, LOKI97, RIJNDAEL, SAFERPLUS, SERPENT および次のストリーム暗 号: ENIGMA (crypt), PANAMA, RC4 ,WAKE がサポートされます。 libmcrypt 2.4.x を使用した場合、暗号モード nOFB もサポートされます。

インストール手順

この拡張機能を利用可能にするためには、 PHP を --with-mcrypt パラメータを 付けてコンパイルする必要があります。必ず、 --disable-posix-threadsを付けて libmcrypt をコンパイルするようにして下さい。

実行用の設定

これらの関数の動作は、php.iniの設定により変化します。

表 1. mcrypt設定オプション

名前デフォルト変更の可否
mcrypt.algorithms_dirNULLPHP_INI_ALL
mcrypt.modes_dirNULLPHP_INI_ALL
PHP_INI_*定数の詳細および定義に関しては、 ini_set()を参照して下さい。

リソース型

この拡張モジュールはリソース型を全く定義し ません。

定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

mcryptは4つのブロック暗号モード(CBC, OFB, CFB, ECB)で実行可能です。 libmcrypt-2.4.x以降にリンクした場合、ブロック暗号モード nOFG と STREAMモードでも実行可能です。MCRYPT_MODE_mode 形式を関数で使用する 際には、いくつかの制約があります。ここで、これらの各モードの通常の使 用法の概要を示します。詳細なリファレンスおよび議論に関しては、 Applied Cryptography by Schneier (ISBN 0-471-11709-9) を参照下さい。

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

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

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

  • MCRYPT_MODE_OFB (output feedback、8ビット形式) はCFBと互換性があ りますが、エラーの伝播が許容されないアプリケーションに使用するこ とが可能です。このモードは(8ビットモードで処理を行うため)安全では なく、使用は推奨されません。

  • MCRYPT_MODE_NOFB (output feedback, nビット形式) はOFB と互換です が、アルゴリズムのブロックサイズを変更可能なため、より安全です。

  • MCRYPT_MODE_STREAM は、WAKEやRC4のようないくつかのストリームアル ゴリズムを読み込む追加のモードです。

他のモードおよびランダムデバイス定数:

MCRYPT_ENCRYPT (integer)

MCRYPT_DECRYPT (integer)

MCRYPT_DEV_RANDOM (integer)

MCRYPT_DEV_URANDOM (integer)

MCRYPT_RAND (integer)

mcrypt暗号

以下にmcrypt拡張モジュールにより現在サポートされている暗号のリス トを示します。サポートされる暗号の完全なリストについては、 mcrypt.h の define を参照下さい。mcrypt-2.2.x API に関する一般的 な規則は、MCRYPT_暗号名でPHPから暗号をアクセス可能であるというこ とです。mcrypt-2.4.xおよびmcrypt-2.5.xのAPIについてもこれらの定数 は使用できますが、mcrypt_module_open() をコー ルする際に文字列で暗号名を指定することも可能です。

  • MCRYPT_3DES

  • MCRYPT_ARCFOUR_IV (libmcrypt > 2.4.x のみ)

  • MCRYPT_ARCFOUR (libmcrypt > 2.4.x のみ)

  • MCRYPT_BLOWFISH

  • MCRYPT_CAST_128

  • MCRYPT_CAST_256

  • MCRYPT_CRYPT

  • MCRYPT_DES

  • MCRYPT_DES_COMPAT (libmcrypt 2.2.x only)

  • MCRYPT_ENIGMA (libmcrypt > 2.4.x のみ、 MCRYPT_CRYPTへのエイリアス)

  • MCRYPT_GOST

  • MCRYPT_IDEA (non-free)

  • MCRYPT_LOKI97 (libmcrypt > 2.4.x のみ)

  • MCRYPT_MARS (libmcrypt > 2.4.xのみ, non-free)

  • MCRYPT_PANAMA (libmcrypt > 2.4.xのみ)

  • MCRYPT_RIJNDAEL_128 (libmcrypt > 2.4.xのみ)

  • MCRYPT_RIJNDAEL_192 (libmcrypt > 2.4.xのみ)

  • MCRYPT_RIJNDAEL_256 (libmcrypt > 2.4.xのみ)

  • MCRYPT_RC2

  • MCRYPT_RC4 (libmcrypt 2.2.xのみ)

  • MCRYPT_RC6 (libmcrypt > 2.4.xのみ)

  • MCRYPT_RC6_128 (libmcrypt 2.2.xのみ)

  • MCRYPT_RC6_192 (libmcrypt 2.2.xのみ)

  • MCRYPT_RC6_256 (libmcrypt 2.2.xのみ)

  • MCRYPT_SAFER64

  • MCRYPT_SAFER128

  • MCRYPT_SAFERPLUS (libmcrypt > 2.4.xのみ)

  • MCRYPT_SERPENT(libmcrypt > 2.4.xのみ)

  • MCRYPT_SERPENT_128 (libmcrypt 2.2.xのみ)

  • MCRYPT_SERPENT_192 (libmcrypt 2.2.xのみ)

  • MCRYPT_SERPENT_256 (libmcrypt 2.2.xのみ)

  • MCRYPT_SKIPJACK (libmcrypt > 2.4.xのみ)

  • MCRYPT_TEAN (libmcrypt 2.2.xのみ)

  • MCRYPT_THREEWAY

  • MCRYPT_TRIPLEDES (libmcrypt > 2.4.xのみ)

  • MCRYPT_TWOFISH (mcrypt 2.x より古いバージョン、 またはmcrypt > 2.4.xの場合)

  • MCRYPT_TWOFISH128 (TWOFISHxxx are available in newer 2.x versions, but not in the 2.4.x versions)

  • MCRYPT_TWOFISH192

  • MCRYPT_TWOFISH256

  • MCRYPT_WAKE (libmcrypt > 2.4.xのみ)

  • MCRYPT_XTEA (libmcrypt > 2.4.xのみ)

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

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

例 1. 入力値を2.2.xにおいて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_3DES, $key, $input, MCRYPT_ENCRYPT);
?>
この例では、$encrypted_dataに文字列として暗号化 されたデータが返されます。

libmcrypt 2.4.xまたは2.5.xとリンクした場合、上記の関数も利用可能 ですが、新しい関数を使用されることを推奨します。

例 2. 2.4.x以降においてECBモードでTripleDESにより入力を暗号化する

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

$td = mcrypt_module_open (MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "");
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
mcrypt_generic_init ($td, $key, $iv);
$encrypted_data = mcrypt_generic ($td, $input);
mcrypt_generic_end ($td);
?>
この例は、$encrypted_dataに文字列として暗号化さ れたデータを取得します。詳細な例については、 mcrypt_module_open()を参照して下さい。

目次
mcrypt_cbc -- CBC モードでデータを暗号化/復号化する
mcrypt_cfb -- CFB モードでデータを暗号化/復号化する
mcrypt_create_iv --  乱数ソースから初期化ベクトル(IV)を生成する
mcrypt_decrypt --  指定したパラメータで暗号化されたテキストを復号化する
mcrypt_ecb -- ECB モードでデータを暗号化/復号化する
mcrypt_enc_get_algorithms_name -- オープンされたアルゴリズムの名前を返す
mcrypt_enc_get_block_size -- オープンされたアルゴリズムのブロックサイズを返す
mcrypt_enc_get_iv_size -- オープンされたアルゴリズムのIVの大きさを返す
mcrypt_enc_get_key_size --  オープンされたモードでサポートされる最大キー長を返す
mcrypt_enc_get_modes_name -- オープンされたモードの名前を返す
mcrypt_enc_get_supported_key_sizes --  オープンされたアルゴリズムでサポートされるキー長を配列にして返す
mcrypt_enc_is_block_algorithm_mode --  オープンされたモードの暗号がブロックモードで動作するかどうかを調べる
mcrypt_enc_is_block_algorithm --  オープンされたモードの暗号がブロックモードであるかどうかを調べる algorithm
mcrypt_enc_is_block_mode --  オープンされたモードがブロック出力を行うかどうかを調べる
mcrypt_enc_self_test --  オープンしたモジュールのセルフテストを実行する
mcrypt_encrypt -- 指定したパラメータでプレーンテキストを暗号化する
mcrypt_generic_deinit --  デストラクタtdにより指定された暗号化を終了する
mcrypt_generic_end -- 暗号処理を終了する
mcrypt_generic_init -- 暗号化に必要な全てのバッファを初期化する
mcrypt_generic -- データを暗号化する
mcrypt_get_block_size -- 指定した暗号のブロックサイズを得る
mcrypt_get_cipher_name -- 指定した暗号の名前を得る
mcrypt_get_iv_size --  指定した暗号/モードの組み合わせに属するIVの大きさを返す
mcrypt_get_key_size -- 指定した暗号のキーの長さを得る
mcrypt_list_algorithms -- サポートされる全ての暗号を配列として取得する
mcrypt_list_modes --  サポートされる全てのモードの配列を取得する
mcrypt_module_close --  デストラクタtdを解放する
mcrypt_module_get_algo_block_size -- 指定したアルゴリズムのブロック長を返す
mcrypt_module_get_algo_key_size --  オープンされたモードでサポートされる最大キー長を返す
mcrypt_module_get_supported_key_sizes -- Returns an array with the supported keysizes of the opened algorithm
mcrypt_module_is_block_algorithm_mode --  指定したモジュールがブロックアルゴリズムであるかどうかを返す
mcrypt_module_is_block_algorithm --  指定したアルゴリズムがブロックアルゴリズムであるかを調べる
mcrypt_module_is_block_mode --  指定したモードがブロック出力を行うかどうかを返す
mcrypt_module_open --  使用するアルゴリズムおよびモードのモジュールをオープンする
mcrypt_module_self_test --  指定したモジュールのセルフテストを実行する
mcrypt_ofb -- OFB モードでデータを暗号化/復号化する
mdecrypt_generic -- データを復号化する