暗号化フィルタ

mcrypt.*mdecrypt.* は、libmcrypt を用いた暗号化・復号化を行います。これらのフィルタは、 mcrypt 暗号化関数 で利用可能な アルゴリズムをサポートしており、mcrypt.ciphername という名前で利用できます。ciphername の部分は、 mcrypt_module_open() に渡すのと同じアルゴリズム名 です。また、以下の 5 つのパラメータが利用できます。

mcrypt フィルタのパラメータ
パラメータ名 必須? 初期値 値の例
mode 任意 cbc cbc, cfb, ecb, nofb, ofb, stream
algorithms_dir 任意 ini_get('mcrypt.algorithms_dir') アルゴリズムモジュールのある場所
modes_dir 任意 ini_get('mcrypt.modes_dir') モードモジュールのある場所
iv 必須 N/A 通常は 8, 16, あるいは 32 バイトのバイナリデータ。暗号の形式に依存する
key 必須 N/A 通常は 8, 16, あるいは 32 バイトのバイナリデータ。暗号の形式に依存する

例1 3DES を用い、ファイルへの出力を暗号化する

<?php
$passphrase 
'My secret';

/* 可読形式のパスフレーズを、再現可能な
 * iv/key のペアに変換する
 */
$iv substr(md5('iv'.$passphrasetrue), 08);
$key substr(md5('pass1'.$passphrasetrue) . 
               
md5('pass2'.$passphrasetrue), 024);
$opts = array('iv'=>$iv'key'=>$key);

$fp fopen('secret-file.enc''wb');
stream_filter_append($fp'mcrypt.tripledes'STREAM_FILTER_WRITE$opts);
fwrite($fp'Secret secret secret data');
fclose($fp);
?>

例2 暗号化されたファイルを読み込む

<?php
$passphrase 
'My secret';

/* 可読形式のパスフレーズを、再現可能な
 * iv/key のペアに変換する
 */
$iv substr(md5('iv'.$passphrasetrue), 08);
$key substr(md5('pass1'.$passphrasetrue) . 
               
md5('pass2'.$passphrasetrue), 024);
$opts = array('iv'=>$iv'key'=>$key);

$fp fopen('secret-file.enc''rb');
stream_filter_append($fp'mdecrypt.tripledes'STREAM_FILTER_READ$opts);
$data rtrim(stream_get_contents($fp));
fclose($fp);

echo 
$data;
?>
add a note add a note

User Contributed Notes 1 note

up
1
Uwe Ohse
1 month ago
1) The mcrypt module has been deprecated with PHP 7.1.
What does that mean for the encryption filters?

2) deriving the IV from the secret passphrase seems wrong. This leaks information about the passphrase without need.

3) using md5() for this? Really? hash() has been available since PHP 5.1.2.

4) hashing the passphrase twice does not add any security.

5) using substr() on binary data (why, oh why, is true passed to md5()?) might lead to headaches if mbstring.func_overload is used.
To Top