2

暗号化と復号化 (Rijndael 256、ecb モード) を 2 つの異なるコンポーネントで実行しようとしています:
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++ コードをコメントに投稿します

ありがとう、ジョニー・デップ

4

1 に答える 1

1

わかった。私は私のコメントを答えにします:

初期化ベクター (IV) は ECB モードでは使用されません。それが提供されている場合、異なる実装は異なる動作をする可能性があります。

実装が正しく機能することを確認したい場合は、0 (ゼロ) の IV を使用してください。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 がまったく使用されていないように見えます。

結果の暗号文が依然として異なる場合、問題は別のものです。
いくつかの可能性が思い浮かびます:

  • エンコーディング - サーバーとクライアントの両方で同じエンコーディングが使用されていますか?
  • エンディアン - サーバーとクライアントはどのタイプのシステムですか? ビッグエンディアン vs リトルエンディアン?
于 2010-06-30T12:16:51.520 に答える