2

c#で暗号化システムを作ろうとしています。これは暗号化のためのコードです。

public static void EncryptFile(string inFile, string outFile, string @inkey)
    {
        try
        {
            UnicodeEncoding ue = new UnicodeEncoding();
            byte[] key = ue.GetBytes(inkey);
            FileStream fsEncrypt = new FileStream(outFile, FileMode.Create);

            RijndaelManaged rmCrypto = new RijndaelManaged();

            CryptoStream cs = new CryptoStream(fsEncrypt, rmCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);
            FileStream fsIn = new FileStream(inFile, FileMode.Open);

            int data;
            while((data=fsIn.ReadByte()) != 1){
                cs.WriteByte((byte)data);
            }

            fsIn.Close(); cs.Close(); fsEncrypt.Close();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message, "Fail to encrypt", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

さて、このコードは実行するたびに例外をスローします。

指定された初期化ベクトル (IV) は、このアルゴリズムのブロック サイズと一致しません

これに関する他の議論を読み、バイト数に問題があると言っています (この関数に渡されるキーの長さは 255 です)。しかし、キーを 16 バイトだけにしてみましたが、まだ機能しません。

いくつかのトラブルシューティングの後、この部分が次のことがわかりました。

CryptoStream cs = new CryptoStream(fsEncrypt, rmCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);

例外をスローします。理由がわかりません。誰でも助けることができますか?

4

1 に答える 1

5

キーを に 2 回渡してCreateEncryptorいますが、キーと IV ( Initialization Vector ) が必要です。2 番目のパラメーターは、128 のランダム ビットの配列である必要があります。RijndaelManaged のデフォルトのブロック サイズは 128 ビットですが、他の値 (256 など) も受け入れます。詳細については、これをお読みください。また、Grzegorz W がコメントで指摘したように、別のキー サイズも選択する必要がある場合があります。

暗号化に慣れていない場合 (その場合は、独自のソリューションを実装する前に停止して詳細を学習するか、代わりに既製のものを使用する必要があります)、IV の機能は、 2 回エンコードされた同じメッセージが生成されるのを防ぎます。同じ暗号文。メッセージごと (およびメッセージの使用ごと) にランダムである必要があり、秘密にしておく必要はありませんが、後でメッセージを解読できるように保存する必要があります (つまり、暗号化後に破棄することはできません)。

于 2013-02-22T07:52:12.690 に答える