以前、C++ CryptoPP Rijndael_128 CBC コードを MCrypt PHP に移植することができましたが、現在、CFB モードで問題が発生しています。C++ と PHP の結果は一致しません (最初のバイトは一致しますが、これは偶然かもしれませんが、他のすべては一致しません)。いくつかの診断では、PHP の mcrypt がキーの長さを正しく設定していないように見えますか?
これがC++です(簡単にするために診断と雑用は削除されています):
CFB_Mode<AES>::Encryption encryptor(g_encrypt_key, AES::DEFAULT_KEYLENGTH, g_encrypt_iv);
StringSource ss( sInput.c_str(), true,
new StreamTransformationFilter( encryptor,
new HexEncoder( new StringSink( sEncryptedOut ) )
));
そして、ここにPHPがあります:
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CFB, '')
mcrypt_generic_init($cipher, $g_encrypt_key, $g_encrypt_iv);
$sEncryptedOutput = mcrypt_generic( $cipher, $sInput);
mcrypt_generic_deinit($cipher);
mcrypt_module_close($cipher);
g_encrypt_key
とg_encrypt_iv
はどちらも 16 バイトの長さで、バイトは C++ と PHP のバージョンで一致します。PHP バージョンの場合、バイトから構築されたバイナリ文字列です (はい、これらが同一であることを確認しました)。
$cipher
のブロック サイズ、キー サイズなどを確認するために、PHP バージョンへの呼び出しを追加しました。ブロック サイズと iv サイズは両方とも 16 です。サポートされている鍵のサイズは、16、24、および 32 と報告されており、すべて予想どおりです。
私が問題だと思うのは、キーサイズが 32 バイトと報告されていることです。mcrypt docs を見ると、キーサイズを設定する唯一の方法は、必要なサイズのキーを提供することです。しかし、私は 16 バイトの鍵を渡しています! では、なぜ 32 バイトのキーの存在を報告しているのでしょうか? CFB モードで 32 バイトのキーを使用する必要がある場合、CryptoPP はなぜそれを問題なく受け入れるのですか? 解決策は何ですか?提供された 16 バイトの鍵を PHP に強制的に使用させることはできますか? または、CryptoPP で MCrypt とは異なる設定にデフォルト設定されている、欠落しているパラメーターがありますか?
結果の暗号化データの長さを最小限に抑えたいので、CFB モードを使用しています。パディングによって導入される数バイトは、このアプリケーションでは重要です。
C ++で暗号化/復号化できる必要がありますが、PHPでのみ暗号化できます。AES は間違いなく、私のアプリケーションにとってやり過ぎです。データ内の個々のバイトの機能が明確にならないように、最低限必要なのは「バイトの適切なスクランブル」です。