Mcrypt を OpenSSL に置き換える
問題: データ暗号化のためにアプリケーションを Mcrypt から OpenSSL に移行する。暗号化暗号は Blowfish で、モードは電子コード ブック (ECB) です。ただし、パラメータが同じであるにもかかわらず、Openssl_encrypt 関数と Openssl_decrypt 関数からの出力は、対応する MCrypt 関数とは異なります。
原因:
この不一致は、によって使用されるパディング アルゴリズムが異なるために発生します。 Mcrypt と OpenSSL。 Mcrypt は PKCS#5 パディングを使用しますが、OpenSSL は PKCS#7 パディングを使用します。 PKCS#7 パディングでは最低 1 バイトのパディングが必要ですが、PKCS#5 パディングでは 0 バイトのパディング長が許可されます。さらに、ECB モードには初期化ベクトル (IV) が必要ありませんが、Mcrypt には ECB モードの初期化ベクトル (IV) が必要です。
解決策:
問題を解決するには、次のいずれかを実行します。 MCrypt 関数を使用する前に入力データを PKCS#7 スタイルのパディングで手動でパディングするか、正しいパディング アルゴリズムを使用してデータを再暗号化してください。
これは、PKCS#7 を使用する質問で提供されたコードの修正バージョンです。 MCrypt のパディング:
$key = "anotherpassword1"; $str = "does it work 12"; $enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $str."", MCRYPT_MODE_ECB); $dec = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB); echo(bin2hex($enc).PHP_EOL); var_dump($dec); $enc = openssl_encrypt($str, 'bf-ecb', $key, true); $dec = openssl_decrypt($enc, 'bf-ecb', $key, true); echo(bin2hex($enc).PHP_EOL); var_dump($dec);
MCrypt 暗号化の前に入力データに 1 バイトのパディングを追加すると、Mcrypt 関数と OpenSSL 関数の両方からの出力が一致します。 ECB モードは IV を必要とせず、IV を提供する必要もないことに注意してください。
以上がMcrypt と OpenSSL が Blowfish-ECB に対して異なる暗号化結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。