暗号化ライブラリの競合(McRypt、libgcrypt)
質問
2つの異なるコンポーネントで暗号化と復号化(Rijndael 256、ECBモード)を実行しようとしています。
1. PHP-サーバー側(McRyptを使用)
2. C + + - クライアント側(GCRYPTを使用)
クライアント側が暗号化されたデータを正しく解読できなかったときに問題に遭遇しました(サーバー側によって作成)
だから...私は次のようにチェックしました
1.初期ベクター - 同じ(32の長さ)
2.キー - 再び両側の同じキー。
そこで、データを暗号化するコードをC ++で書きました(PHPのような同じパラメーターを使用)
そして、暗号化されたデータには異なるバイトが含まれていることがわかりました(おそらくエンコードの問題??)
助けてくれてうれしいです
PHP -McRypt
// Encrypt Function
function mc_encrypt($encrypt, $mc_key) {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$iv = "static_init_vector_static_init_v";
echo "IV-Size: " . $iv_size . "\n";
echo "IV: " . $iv . "\n";
$passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, $encrypt, MCRYPT_MODE_ECB, $iv);
print_hex($passcrypt);
return $encode;
}
mc_encrypt("Some text which should be encrypted...","keykeykeykeykeykeykeykeykeykeyke");
C ++コードをコメントに投稿します
ありがとう、ジョニー・デップ
解決
わかった。私のコメントを答えます:
初期化ベクトル(IV)はECBモードでは使用されません。提供されている場合、異なる実装は異なる動作をする可能性があります。
実装が正しく機能することを確認したい場合は、IVの0(ゼロ)を使用します。 IVを提供しても、両方の実装はそれを無視する必要がありますが、それについては決して確信できません。 ECBモードでIVを提供しないことも機能するはずですが、繰り返しますが、すべて実装に依存します。
PHPによると ドキュメンテーション McRyptはそれを無視します。 gcrypt私はよくわかりません。
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB)
ECBモードを指定するため、実際に0を返す必要があります。
編集:
電話はしないで下さい mcrypt_get_iv_size
また mcrypt_create_iv
.
代わりに電話してください mcrypt_encrypt
IVなし。 PHPによると ドキュメンテーション IVのすべてのバイトは「 0」に設定されます。
C ++コードについても同じことが言えます。 IVをまったく設定する必要はありません。 libgcryptコードは複雑ですが、バージョン1.4.5のソースを見てから、ECBモードではIVがまったく使用されていないようです。
結果の暗号文がまだ異なる場合、問題は別のものです。
いくつかの可能性が思い浮かびます:
- エンコーディング - 同じエンコードがサーバーとクライアントの両方で使用されていますか?
- Endianness-サーバーとクライアントはどのタイプのシステムですか?ビッグ対リトルエンディアン?