0

我使用AES加密。当我加密然后解密整个文件时没关系。我想将多个文件添加到一个加密的文件中。这就是问题所在。加密很好,但解密会导致 CryptographicException - 数据长度错误。甚至可以解密文件的一部分还是整个加密?我使用了一个加密流并将所有要加密的文件传递给单个文件。我试图做相反的事情:

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. 具有加密大小的定义读取填充数组

  4. 解密循环(使用已知大小读取

  5. 关闭输出流

我希望这个对你有用。

于 2013-02-03T10:48:25.113 回答
0

简短形式:“你不能从这里到达那里”,这是不可能的。

如果您查看 AES 工作原理的描述,您会看到两件事。

1 AES 使用 128 位的块大小,因此如果您的文件长度不是 8 字节的倍数,则附加部分中的块不会排列,

2:AES 使用根据 rijndael 密钥计划为每个块使用不同的密钥,这很可能会破坏交易。

如果您需要能够连接加密文件,则将它们包装起来以使连接可​​见并且可以单独解密片段(gzip 在压缩时执行此操作)或使用固定替换密码,例如 rot13

于 2013-02-03T10:55:23.137 回答
0

它可以完成并且正在工作。我在加密期间制作了包含加密文件长度的表格。比我解密确切的部分(带填充)。

于 2013-02-03T11:37:10.930 回答