PHP5.3 RC2(Windows版)で確認したところ、下記のエクステンションが無いことが気になった。
- php_mcrypt.dll
- php_pdo.dll
- php_zip.dll
でも、MCryptもPDOもZIPもできたので問題無かった。
PHP本体に取り込まれた?
僕らはプールの底を歩き続ける。まるで自分の影とダンスを踊るように。
PHP5.3 RC2(Windows版)で確認したところ、下記のエクステンションが無いことが気になった。
(2012/12/01追記)
手っ取り早くPHPで暗号化したいなら、CodeBook.phpを使うのがお勧め。
(追記終わり)
AESとは?
暗号化方式の1つ。ブロック長は128bitsのみ、鍵長は128・192・256bitsの3つから選択できる。
AESの元となる暗号化方式はRijndaelだが、Rijndaelではブロック長についても128・192・256bitsから選択できるという違いがある。
PHPでの使用例(CBCの場合)
$key = '秘密の合言葉';
$text = '暗号化するメッセージ';
srand();
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
$hex = bin2hex($encrypted);
$bin = pack('H*', $hex);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $bin, MCRYPT_MODE_CBC, $iv);
echo $text . ' => ' . rtrim($decrypted);
注意: MCRYPT_RAND を使用する場合、乱数生成器を初期化するために、 必ず mcrypt_create_iv() の前に srand() をコールしてください。rand() のように、自動的に 初期化されるわけではありません。
$key = '秘密の合言葉';
$text = '暗号化するメッセージ';
srand();
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($size, MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB, $iv);
$hex = bin2hex($encrypted);
//暗号化に使ったのと別のIVを使ってみる
$iv2 = mcrypt_create_iv($size, MCRYPT_RAND);$bin = pack('H*', $hex);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $bin, MCRYPT_MODE_ECB, $iv2);
echo bin2hex($iv) . ' : ' . bin2hex($iv2) . '<br />';
echo $text . ' => ' . rtrim($decrypted);
Attempt to use an empty IV, which is NOT recommend
print_r(mcrypt_module_get_supported_key_sizes(MCRYPT_RIJNDAEL_128));
↓
array(3) {
[0]=>int(16)
[1]=>int(24)
[2]=>int(32)
}
//同じKEYか確かめるfunction
function is_same_key($key1, $key2) {
$text = '暗号化するメッセージ';
srand();
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_RAND);
$encrypted1 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key1, $text, MCRYPT_MODE_CBC, $iv);
$encrypted2 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key2, $text, MCRYPT_MODE_CBC, $iv);
return ($encrypted1 === $encrypted2);
}
//足りない分をNULL文字で埋めるfunction
//(str_pad()では\0によるパディングが上手くいかなかった)
function pad($str, $len) {
for ($i = strlen($str); $i < $len; $i++) {
$str .= "\0";
}
return $str;
}
$key = str_repeat('a', 15);
var_dump(is_same_key($key, pad($key, 16))); //true
var_dump(is_same_key($key, pad($key, 24))); //false
var_dump(is_same_key($key, pad($key, 32))); //false
$key = str_repeat('a', 16);
var_dump(is_same_key($key, pad($key, 16))); //true
var_dump(is_same_key($key, pad($key, 24))); //false
var_dump(is_same_key($key, pad($key, 32))); //false
$key = str_repeat('a', 17);
var_dump(is_same_key($key, pad($key, 16))); //true
var_dump(is_same_key($key, pad($key, 24))); //true
var_dump(is_same_key($key, pad($key, 32))); //false
$key = str_repeat('a', 24);
var_dump(is_same_key($key, pad($key, 16))); //true
var_dump(is_same_key($key, pad($key, 24))); //true
var_dump(is_same_key($key, pad($key, 32))); //false
$key = str_repeat('a', 25);
var_dump(is_same_key($key, pad($key, 16))); //true
var_dump(is_same_key($key, pad($key, 24))); //true
var_dump(is_same_key($key, pad($key, 32))); //true
$key = str_repeat('a', 25);
var_dump(is_same_key($key, pad($key, 16))); //true
var_dump(is_same_key($key, pad($key, 24))); //true
var_dump(is_same_key($key, pad($key, 32))); //true
extension=php_mcrypt.dllmcrypt_create_iv()の第2引数には注意。
Windows でサポートされているのは MCRYPT_RAND のみです。なぜなら、Windows には(当然) /dev/random あるいは /dev/urandom が存在しないからです。
yum install php-mcrypt通常はこれでOK。