このPHPスクリプト(encrypt.php)があります。
<?php
function encrypt($pure_string, $encryption_key, $encryptionMethod = "AES-256-CBC")
{
$iv = "3571984260";
$encrypted_string = openssl_encrypt($pure_string, $encryptionMethod, $encryption_key, false, $iv);
return $encrypted_string;
}
echo encrypt ("$argv[1]", 'mysecret');
?>
それはうまくいきますが、openssl cliを介して同じ結果を得ようとしています(必要です)。
しかし、これは:
echo '12345' | openssl enc -aes-256-cbc -iv "3571984260" -k mysecret -a
次の結果は生成されません。
php encrypt.php 12345
実際、シェルバージョンは実行されるたびに生成される文字列を変更しますが、PHPバージョンは常に同じ文字列を生成します。 PHPスクリプトと同じ結果を得るには、openssl cliを使用する必要があります。
私は何が間違っていましたか?
答え1
見つけました!
phpは変数iv
とkey
変数を文字列として使用するため、openssl
CLIは前述のように空白と改行文字のない文字列の16進バージョンを期待します。
まず、次のようにivを変換し、文字列を16進数で渡す必要があります。
IVに対応する16進数を決定します。
hexiv=$(echo $(echo -n '3571984260' | od -A n -t x1) | tr -d " ")
16進数に対応する値を決定しますmysecret
。
hexpass=$(echo $(echo -n 'mysecret' | od -A n -t x1) | tr -d " ")
もう一つ、phpのパスはopenssl cliのパスではなくKEYです。
echo -n '12345' | openssl enc -aes-256-cbc -iv "$hexiv" -K "$hexpass" -a
今PHPスクリプトと同じように動作します!
重要:大文字を使用する必要があります-K
。それ以外の場合、結果の文字列は同じではありません。