ホームページ >バックエンド開発 >PHPチュートリアル >Mcrypt と OpenSSL が Blowfish-ECB に対して異なる暗号化結果を生成するのはなぜですか?

Mcrypt と OpenSSL が Blowfish-ECB に対して異なる暗号化結果を生成するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-20 19:10:16783ブラウズ

Why Do Mcrypt and OpenSSL Produce Different Encryption Results for Blowfish-ECB?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。