My Photo

« PHPメモ043:セッションの有効期間の設定 | Main | コマンドプロンプトのFTPクライアントで自動ログイン »

September 01, 2014

PHPメモ044:PHPで暗号化・復号化

PHPでの暗号化・復号化にはMcypt関数を使う。
暗号化・復号化関数のサンプル。

define('SECRET_KEY', 'nanchara');	// パスワード暗号化キー

// 文字列暗号化
function encrypt_string($str) {
	
	// オープン
	$td = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');
	$key_size = mcrypt_enc_get_key_size($td);
	$key = substr(md5(SECRET_KEY), 0, $key_size);
	$iv_size = mcrypt_enc_get_iv_size($td);
	$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
	
	// 初期化
	mcrypt_generic_init($td, $key, $iv);
	
	// 暗号化
	$encrypted = mcrypt_generic($td, $str);
	$encrypted = base64_encode($encrypted);
	
	// 終了
	mcrypt_generic_deinit($td);
	
	// クローズ
	mcrypt_module_close($td);
	
	return $encrypted;
}

// 文字列復号化
function decrypt_string($encrypted) {
	
	// オープン
	$td = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');
	$key_size = mcrypt_enc_get_key_size($td);
	$key = substr(md5(SECRET_KEY), 0, $key_size);
	$iv_size = mcrypt_enc_get_iv_size($td);
	$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
	
	// 初期化
	mcrypt_generic_init($td, $key, $iv);
	
	// 復号化
	$decrypted = mdecrypt_generic($td, base64_decode($encrypted));
	$decrypted = rtrim($decrypted);
	
	// 終了
	mcrypt_generic_deinit($td);
	
	// クローズ
	mcrypt_module_close($td);
	
	return $decrypted;
}

上記の関数の最初に書いたバージョンは異常に遅くなることがあった。1回だけ実行する場合は問題ないのだが、大体3回以上連続して実行すると1回に10秒とか20秒とかかかる。原因は mcrypt_create_iv() の第2引数を MCRYPT_DEV_RANDOM としていたことだった。
MCRYPT_DEV_RANDOM だと mcrypt_create_iv() は初期化ベクトル(IV)生成のためのソースを /dev/random から読む。この /dev/random は乱数生成に必要な情報がない場合に情報が貯まるまで止まる。よって、暗号化・復号化関数を連続して実行すると mcrypt_create_iv() の /dev/random を読むところで止まってしまう。
第2引数を MCRYPT_DEV_URANDOM に変更したところ、問題は解決した。この場合、乱数を /dev/urandom から読む。/dev/urandom は本当の乱数ではなく疑似乱数らしいが仕方がない。
ちなみに、mcrypt_create_iv()のドキュメントを読むと、mcrypt_create_iv() の第2引数を省略した場合のデフォルトは MCRYPT_DEV_URANDOM だった。一方、下の方に書いてあるサンプルコードでは MCRYPT_DEV_RANDOM を使っていた。サンプルコードがあったらそれに倣ってコーディングするよね…。

Mcrypt関数についての参考ページ:
PHP: mcrypt_generic - Manual
omnioo lab. record | オムニオラボ WEB, LAMP, jQuery, ITのお話

/dev/randomについての参考ページ:
/dev/random - Wikipedia
/dev/random の乱数生成... - trial and error

« PHPメモ043:セッションの有効期間の設定 | Main | コマンドプロンプトのFTPクライアントで自動ログイン »

PHP」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/60246273

Listed below are links to weblogs that reference PHPメモ044:PHPで暗号化・復号化:

« PHPメモ043:セッションの有効期間の設定 | Main | コマンドプロンプトのFTPクライアントで自動ログイン »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof