PHPのopenssl_encrypt関数で暗号化したものをopensslコマンドで複合化


PHPのopenssl_encryptとopenssl

phpのopenssl_encrypt()で暗号化した文字列をopensslコマンドで複合化しないといけない案件があったのでメモ

エンコード条件

ivを指定してエンコードするのが定石だが、今回はivの指定がなかった。

$enc_key = "abcedfg";
$enc_method = "aes-256-cbc";
$text = "some encode text";

openssl_encrypt($text, $enc_method, $enc_key);

opensslで復号

openssl_encrypt()はIVの指定をしていない場合、key文字列と同じものが指定されるもよう

ポイント
- key文字列を16進数にしたものを-Kオプションに指定する
- ivは-Kオプションに指定した文字の先頭数文字が対応するみたい(文字数はmethod依存?)

/**
 * 文字列を16進数に変換
 * @param $x
 * @return string
 */
function strtohex($x)
{
    $s='';
    foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
    return($s);
}


$key = strtohex($enc_key);
$iv = substr($key, 0, 32);  //$keyの先頭32文字で複合化できた

$cmd = sprintf('echo -n "%s" | openssl enc -d -%s -base64 -A -K %s -iv %s',
  $custom_data, $key, $iv, $iv);

exec($cmd, $out);
echo $out;