0

AES暗号化を使用しています。ファイル全体を暗号化してから復号化しても問題ありません。暗号化された 1 つのファイルに複数のファイルを追加したい。そこが問題です。暗号化は問題ありませんが、復号化により CryptographicException - 不正なデータ長が発生します。ファイルの一部を解読することさえ可能ですか、それとも全体が暗号化されていますか? 1 つのクリプトストリームを使用し、暗号化したいすべてのファイルを 1 つのファイルに渡しました。私は反対のことをしようとしています:

AesManaged aes = AES.InitAes(key, salt);
            ICryptoTransform transform = aes.CreateDecryptor(aes.Key, aes.IV);
            int defChunkSize = 1024 * 1024 * 50;

            using (FileStream source = new FileStream(header.data.filename, FileMode.Open))
            {
                foreach (CryptHeader.fileStruct file in header.data.files)
                {
                    preparePath(file.filename);

                    using (FileStream target = new FileStream(file.filename, FileMode.Create))
                    {
                        using (CryptoStream cryptoStream = new CryptoStream(target, transform, CryptoStreamMode.Write))
                        {
                            long padding = source.Length - header.data.files.Sum(x => x.length);//Just test
                            int chunkSize = (defChunkSize > (int)file.length) ? (int)file.length : defChunkSize;
                            byte[] chunkData = new byte[chunkSize];
                            int bytesRead = 0;
                            int totalRead = 0;
                            while (totalRead < file.length)
                            {
                                bytesRead = source.Read(chunkData, 0, chunkSize);
                                if (bytesRead <= 0) break;
                                totalRead += bytesRead;
                                cryptoStream.Write(chunkData, 0, bytesRead);
                            }      
                            chunkData = null;
                        }
                    }
                }
            }    
4

3 に答える 3

2

私は何の問題もなく同じ数年前に同じことをしました。私が使用したロジックは次のとおりです。

暗号化

  1. ファイル数を定義する

  2. 暗号化されたサイズを保持するための配列を定義する

  3. 出力ストリームを開く

  4. (ファイル数 * 4) + 4 までシーク (強制) (長さが整数であると仮定)

  5. 暗号化のためのループ (暗号化 - 暗号化されたデータの書き込み - 割り当てられた暗号化されたサイズ)

  6. 0 にシーク (開始)

  7. 書き込みファイル数

  8. 暗号化されたサイズの配列を書き込む

  9. 出力ストリームを閉じる

復号化

  1. 入力ストリームを開く

  2. 読み取りファイル数

  3. 暗号化されたサイズの define-read-fill 配列

  4. 復号化のためのループ (既知のサイズを使用して読み取る)

  5. 出力ストリームを閉じる

これが役立つことを願っています。

于 2013-02-03T10:48:25.113 に答える
0

それは実行でき、機能しています。暗号化中に、暗号化されたファイルの長さを含むテーブルを作成します。正確な部分を解読するよりも(パディング付き)。

于 2013-02-03T11:37:10.930 に答える
0

省略形: 「ここからそこに行くことはできません」、不可能です。

AES の仕組みの説明を見ると、2 つのことがわかります。

1 AES は 128 ビットのブロック サイズを使用するため、ファイルの長さが 8 バイトの倍数でない場合、追加部分のブロックは整列しません。

2: AES の使用は、rijndael キー スケジュールに従ってブロックごとに異なるキーを使用します。

暗号化されたファイルを連結できるようにする必要がある場合は、それらをラップして、結合が表示され、フラグメントを個別に復号化できるようにする (gzip は圧縮時にこれを行います) か、rot13 のような固定置換暗号を使用します。

于 2013-02-03T10:55:23.137 に答える