2

午後、

したがって、私はこれらすべての暗号化方法と使用法にかなり慣れていません。暗号化の実装を構築し始めたところです。今、私の暗号化と復号化の方法はうまく機能しているようです。私が読むまで、RijndaelManagedクラスでハードコードされたIVを使用することにひどく失敗しました。

暗号化された各ファイルのIVを「暗号化時」に一意に生成し、ファイルの先頭/先頭に保存し、残りの暗号化バイトはこの直後に保存する方がよい(そして安全である)ことをどこでも読んでいます。(私がこれを正しく理解していれば)

ファイルを暗号化するたびに、ファイルの最初の16バイト(クラス、MSDN、Google、およびこのフォーラムの一部の人々が提案したように)にIVを書き込むため、問題を理解するのに非常に苦労しています。その直後に、残りの暗号化されたバイトをファイルストリームに書き込みます。(IVはプレーンテキストで保存されます。または暗号化されていないバイト<これも大丈夫ですか?)

私の問題は、まったく同じキーを使用してファイルを復号化しようとすると失敗することです。復号化(バッファリング)のためにファイルのチャンクを読み取り始める前に、プレーンテキストIVのファイルの最初の16バイトを読み取り、RijndaelManagedクラスで使用しようとします。実例。

これは失敗するようです。確認したところ、どこかで男子生徒のエラーが発生している可能性があります。復号化したい場合、暗号化ファイルから同じ16バイトを読み取れないように見えるためです。

これは、暗号化の前にファイル処理を行うために使用するコードです(暗号化自体ではありません)


using (RijndaelManaged RM = new RijndaelManaged())
using (FileStream StreamIN = new FileStream(FileIN, FileMode.Open, FileAccess.Read))
using (FileStream StreamOUT = new FileStream(FileOUT, FileMode.Append, FileAccess.Write))
{
    //Setup Variable ChunkSize and The Total bytes Read into the streams
    int ChunkSize = 1024 * 1024 * 32; 

    RM.GenerateIV();

    foreach (var item in RM.IV)
    {
        Console.Write("[ " + item + "] ");
    }

    StreamOUT.Seek(0, SeekOrigin.Begin);
    StreamOUT.Write(RM.IV, 0, RM.IV.Length);
    StreamOUT.Seek(RM.IV.Length, SeekOrigin.Begin);

    int TotalBytesRead = 0;                       

    //File Buffer Implementation
    for (long i = 0; i < StreamIN.Length; i += ChunkSize)
    {
        //ChunkData byte array determined by ChunkSize
        byte[] ChunkData = new byte[ChunkSize];
        //Current Bytes Read from the IN Stream
        int BytesRead = 0;
        while ((BytesRead = StreamIN.Read(ChunkData, 0, ChunkSize)) > 0)
        {
            //Call Encryption from local Class

            Console.WriteLine("Bytes Read: {0}", TotalBytesRead += BytesRead);

            ChunkData = Crypt.Encrypt(ChunkData, KeyBytes, RM.IV);

            //Write byte array to File
            StreamOUT.Write(ChunkData, 0, BytesRead);
        }
    }
}

そして、これは復号化の前にファイルを処理するための私のコードです(復号化自体ではありません)

using (RijndaelManaged RM = new RijndaelManaged())
using (FileStream StreamIN = new FileStream(FileIN, FileMode.Open, FileAccess.Read))
using (FileStream StreamOUT = new FileStream(FileOUT, FileMode.Append, FileAccess.Write))
{
    //Setup Variable ChunkSize and The Total bytes Read into the streams
    int ChunkSize = 1024 * 1024 * 32; 


    StreamIN.Seek(0, SeekOrigin.Begin);
    int Read = StreamIN.Read(RM.IV, 0, 16);
    StreamIN.Seek(RM.IV.Length, SeekOrigin.Begin);

    int TotalBytesRead = 0;

    foreach (var item in RM.IV)
    {
        Console.Write("[ " + item + "] ");
    }

    //File Buffer Implementation
    for (long i = 0; i < StreamIN.Length; i += ChunkSize)
    {
        //ChunkData byte array determined by ChunkSize
        byte[] ChunkData = new byte[ChunkSize];
        //Current Bytes Read from the IN Stream
        int BytesRead = 0;

        while ((BytesRead = StreamIN.Read(ChunkData, 0, ChunkSize)) > 0)
        {

            Console.WriteLine("Bytes Read: {0}", TotalBytesRead += BytesRead);                                

            //Call Decryption from local Class
            ChunkData = Crypt.Decrypt(ChunkData, KeyBytes, RM.IV);

            //Write byte Array to file
            StreamOUT.Write(ChunkData, 0, BytesRead);
        }
    }
}

それだけだと思いますか?また、「コンソール」やその他の役に立たない呼び出しは、これまでのところ問題を確認して把握するためにのみ行われます。Visual Studios 2010を使用していて、RijndaelManagedクラスを実装しようとしています。

暗号化/復号化メソッドには、キーとIVを含むFileChunks(バイト配列)が渡され、これらはストリームに保存されるバイト配列(Crypted)を返します。

私の質問が明確であることを願っていますか?もっとよく説明しようとしないなら、私はこの特定の問題についての助けを探してどこでも読んだことがありますが、ここに投稿された他のほとんどの質問は私の範囲外です。

私は本当に助けていただければ幸いです、私はどこかでピエロの間違いを犯していると確信しています。

ありがとうございました!!

4

1 に答える 1

1

長年のフレームワークガイドラインによるとSymmetricAlgorithm.IV、内部配列を返さないように作成されているようです。これは、コピーが返されることを意味するため、それ以降の変更はRijndaelManagedインスタンスに反映されません。

// Effectively reading the persisted value into a temporary array
// and throwing away the temporary.
int Read = StreamIN.Read(RM.IV, 0, 16);

変更を固定してIVを永続化された値に設定するにはIV、以前に返された値を変更するだけでなく、実際にプロパティを明示的に設定する必要があります。

byte[] persistedIv = new byte[16];
StreamIN.Read(persistedIv, 0, persistedIv.Length);
RM.IV = persistedIv;
于 2012-10-21T20:22:34.183 に答える