PHP で AES-256-CBC 暗号化と復号化

綺麗にまとまったので書き込んでおきます。

<?php
//http://qiita.com/ymmtmsys/items/a38d4ddadf548c8a482c を参考にしました。

$plain_data = 'plain text';
$password = 'PASSWORD';

$method = 'AES-256-CBC';
$initial_vector_length = openssl_cipher_iv_length($method);
$initial_vector = mcrypt_create_iv($initial_vector_length, MCRYPT_RAND);

$data = $initial_vector . $plain_data;
$base64_encode_crypt_data = openssl_encrypt($data, $method, $password, 0, $initial_vector); //暗号化
$encode_crypt_data = base64_decode($base64_encode_crypt_data);

//別の箇所で暗号化された場合で URL safe な encode を行っている場合、下記の方が良い。
//$encode_crypt_data = base64_decode(str_replace(array('-', '_', '='), array('+', '/', ''), $base64_encode_crypt_data));

//initial vector は先頭 $initial_vector_length の BYTE に格納されている
$initial_vector = substr($encode_crypt_data, 0, $initial_vector_length);

//暗号文本体は $encode_crypt_data の先頭の $initial_vector を除いたもの全て
$crypt_body_data = substr($encode_crypt_data, $initial_vector_length);
$base64_crypt_body_data = base64_encode($crypt_body_data);
echo openssl_decrypt($base64_crypt_body_data, $method, $password, 0, $initial_vector) . PHP_EOL;    //復号化
$ php openssl.php
plain text


mimic28号でした。