1

この例の AES 暗号化機能をテストしています。IV別のランダム データに変更すると、テキストの一部だけがアクセスできなくなり、他の部分は正しく復号化されることがわかりました。

これは私のコードです:

    public static string encrypt(string original, string key, string iv)
    {
        string enc;
        // Create a new instance of the RijndaelManaged
        // class.  This generates a new key and initialization 
        // vector (IV).
        // Encrypt the string to an array of bytes.
        byte[] encrypted =EncryptStringToBytes_Aes(original, Convert.FromBase64String(key), Convert.FromBase64String(iv));

        enc = Convert.ToBase64String(encrypted);

        return enc;
    }

    public static string decrypt(string encrypted, string key, string iv)
    {
        string decrypted;

        decrypted = DecryptStringFromBytes_Aes(Convert.FromBase64String(encrypted), Convert.FromBase64String(key), Convert.FromBase64String(iv));

        return decrypted;
    }

そして、これらは私のEncryptStringToBytes_AesandDecryptStringFromBytes_Aes関数です。

たとえば、私の入力文字列はHello, I think Hugo is a great movie!. base64ed keylbMvxzBtu057yeNV5d/5MC7tlau7zfRXMtfLSUOBa7ueMGqRrm23H5uYGLmDcdJ3base64ed IVで暗号化されます。(上記のコードでわかるように、base64 化されたキーと IV を関数の入力として取得し、それらを関数でデコードします)gbpldgjBitwQXrQbbyHr+5J0cXADYAm+po8B29rYVJc=Ti7OcORScdXS/Ll7m1KdeQ==

ここで、IV を変更しm4u5eqD7BZP11P5PYGfV7Q==てもキーには触れずに、暗号化された文字列を復号化しようとすると、次の結果が得られます��f+�T\/]�^h�ugo is a great movie!

ご覧のとおり、入力文字列 ( ugo is a great movie!) の一部が正常に復号化されました。それは普通ですか?はいの場合、これを防ぐ方法は? これよりも安全なアルゴリズムは他にありますか? いいえの場合、コードの何が問題になっていますか?

4

1 に答える 1

5

CBC を使用する場合、間違った IV は最初のブロック (AES の場合は最初の 16 バイト) の復号化のみを妨げます。これは設計によるものであり、弱点ではありません。

キーはわかっているが IV がわからない場合、CBC 暗号文を復号化できますか?を参照してください。CBC が IV をどのように扱うかの詳細については。

于 2012-09-13T13:45:27.930 に答える