コマンドラインでopensslにPHPなどのパスワードを暗号化させる方法

コマンドラインでopensslにPHPなどのパスワードを暗号化させる方法

この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は変数ivkey変数を文字列として使用するため、opensslCLIは前述のように空白と改行文字のない文字列の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。それ以外の場合、結果の文字列は同じではありません。

関連情報