Edited at

PHPで文字列を暗号化

openssl_encrypt


  • 第三引数までで良いのかと思ったら警告が出る

Using an empty Initialization Vector (iv) is potentially insecure and not recommended

利用可能な暗号メソッド

openssl_random_pseudo_bytesだとバイナリになりコードに書けないのでivは一旦文字列化しています。

固定する必要が無ければopenssl_random_pseudo_bytesのままでOK

// バイナリを16進数に変換

$hex_iv_string = bin2hex(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = hex2bin($hex_iv_string);// 16進数をバイナリに変換

または

// バイナリをbase64に変換

$base64_iv_string = base64_encode(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = base64_decode($base64_iv_string);// base64をバイナリに変換

$target_string = '暗号化したい文字列';

$method_name = 'AES-256-CBC';
$key_string = 'キー文字列';
// 固定する必要がある場合はこれを実行した値で固定
$hex_iv_string = bin2hex(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = hex2bin($hex_iv_string);
// 暗号化
$base64_encrypt_string = openssl_encrypt(
$target_string,
$method_name,
$key_string,
0,
$iv
);

// 復号
$decrypt_string = openssl_decrypt(
$base64_encrypt_string,
$method_name,
$key_string,
0,
$iv
);

var_dump($target_string);
var_dump($base64_encrypt_string);
var_dump($decrypt_string);

string(27) "暗号化したい文字列"

string(44) "BLUJX2CNbIy+kSps/0xhNt7yMDZIBuomh5jpuVQD+aQ="
string(27) "暗号化したい文字列"

$target_string = '暗号化したい文字列';

$method_name = 'AES-256-CBC';
$key_string = 'キー文字列';
// 固定する必要がある場合はこれを実行した値で固定
$hex_iv_string = bin2hex(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = hex2bin($hex_iv_string);

// 暗号化
$encrypt_bin = openssl_encrypt(
$target_string,
$method_name,
$key_string,
OPENSSL_RAW_DATA,
$iv
);

$hex_encrypt_string = bin2hex($encrypt_bin);// バイナリを16進数に変換

// 復号
$decrypt_string = openssl_decrypt(
hex2bin($hex_encrypt_string),// 16進数をバイナリに変換
$method_name,
$key_string,
OPENSSL_RAW_DATA,
$iv
);

var_dump($target_string);
var_dump($encrypt_hex_string);
var_dump($decrypt_string);

string(27) "暗号化したい文字列"

string(64) "c327a6ce0bc8e8b88078652dc4a8ce29d1da36444f8cce45340639104c6f04e0"
string(27) "暗号化したい文字列"

$target_string = '暗号化したい文字列';

$method_name = 'AES-256-CBC';
$key_string = 'キー文字列';
// 固定する必要がある場合はこれを実行した値で固定
$hex_iv_string = bin2hex(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method_name)));
$iv = hex2bin($hex_iv_string);

// 暗号化
$encrypt_bin = openssl_encrypt(
$target_string,
$method_name,
$key_string,
OPENSSL_RAW_DATA,
$iv
);

$base64_encrypt_string = base64_encode($encrypt_bin);// バイナリをbase64エンコード

// 復号
$decrypt_string = openssl_decrypt(
base64_decode($base64_encrypt_string),// base64デコードしてバイナリに変換
$method_name,
$key_string,
OPENSSL_RAW_DATA,
$iv
);

var_dump($target_string);
var_dump($base64_encrypt_string);
var_dump($decrypt_string);

string(27) "暗号化したい文字列"

string(44) "TVg7Xt1Z0PHTmzhCTVEMukvU7nHtgDSfz/qCiqs5/lI="
string(27) "暗号化したい文字列"