4

これは、ファイルを暗号化し、暗号を新しいファイルに書き込む必要がある私のコードの一部です。コードは、Microsoft MSDN Web ページにある例に似ています。

byte[] inputBuffer = new byte[InputFileStream.Length];
byte[] outputBuffer = new byte[InputFileStream.Length];

InputFileStream.Read(inputBuffer, 0, (int)InputFileStream.Length);

ICryptoTransform encryptor = AesInstance.CreateEncryptor(AesInstance.Key, AesInstance.IV);


            using (MemoryStream memoryStream = new MemoryStream())
            {

                using (CryptoStream stream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter encrypted = new StreamWriter(stream))
                    {

                        encrypted.Write(inputBuffer);

                    }

                    outputBuffer = memoryStream.ToArray();

                    OutputFileStream.Write(outputBuffer, 0, (int)outputBuffer.Length);


                }

            }

OutputFileStream.Close();
InputFileStream.Close();`

問題は、入力バッファーがファイルから正しいバイトを読み取ることですが、出力バッファーには 16 バイトのデータしかないようです。その結果、入力ファイルが大きい場合でも、出力ファイルは 16 バイトしかありません。間違いはどこですか?さまざまなモード、ECB、CBC などに問題があります。

4

4 に答える 4

2

この質問はかなり古いですが、より良い説明が必要です。問題はそれ自体に隠されていStreamWriterます。このクラスは、テキストをストリームに書き込むために使用する必要があります。ただし、テキストはinputBufferありません。バイト配列です!

encrypted.Write(inputBuffer);

に等しい

encrypted.Write(inputBuffer.ToString());

MSDNによるとStreamWriter.Write(object)

オブジェクトの ToString メソッドを呼び出して、オブジェクトのテキスト表現をテキスト文字列またはストリームに書き込みます。

正しい解決策は、入力バッファを に直接書き込むことCryptoStreamです。

using (MemoryStream msEncrypt = new MemoryStream(outputBuffer))
{
    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
    {
         csEncrypt.Write(inputBuffer, 0, inputBuffer.Length);
    }
    return msEncrypt.ToArray();
} 
于 2016-09-08T08:34:33.090 に答える
0

わかりました。これで修正されました。マークの回答のおかげで、どのように機能するかがわかりました。誰かが後でそれを必要とする場合、ここに作業コードがあります:

            InputFileStream.Read(inputBuffer, 0, (int)InputFileStream.Length);
            InputFileStream.Flush();
            InputFileStream.Close();

            using (MemoryStream msEncrypt = new MemoryStream(outputBuffer))
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(inputBuffer);
                        swEncrypt.Flush();
                        swEncrypt.Close();
                    }
                    csEncrypt.Flush();
                    csEncrypt.Close();
                }
                OutputFileStream.Write(outputBuffer, 0, (int)outputBuffer.Length);
                OutputFileStream.Flush();
                OutputFileStream.Close();
            }

完璧なコードではないかもしれませんが(冗長かもしれないことはわかっています)、巨大なファイルでも問題なく動作します。

于 2013-05-10T19:18:50.983 に答える
0

私はあなたが使用するとき、私は信じています

encrypted.Write(inputBuffer);

ライターに書き込むバッファのサイズを与えていません。

于 2013-05-08T17:46:32.383 に答える