質問

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-サーバーとクライアントはどのタイプのシステムですか?ビッグ対リトルエンディアン?
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top