解密部分AES流

时间:2013-02-03 10:22:04

标签: c# io cryptography aes

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

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;
                        }
                    }
                }
            }    

3 个答案:

答案 0 :(得分:2)

几年前我做过同样没有任何问题。我使用的逻辑如下:

<强>加密

  1. 定义文件数

  2. 定义用于保持加密大小的数组

  3. 打开输出流

  4. 寻求(强制)到(文件数* 4)+ 4(假设长度为整数)

  5. 加密循环(加密 - 写入加密数据 - 分配加密大小)

  6. 寻求0(开始)

  7. 写入文件数

  8. 写入加密的大小数组

  9. 关闭输出流

  10. <强>解密

    1. 打开输入流

    2. 读取文件数

    3. 具有加密大小的define-read-fill数组

    4. 解密循环(使用已知尺寸读取

    5. 关闭输出流

    6. 我希望这会有所帮助。

答案 1 :(得分:0)

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

如果你看一下AES如何工作的描述,你会看到两件事。

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

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

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

答案 2 :(得分:0)

可以做到并且它正在发挥作用。我在加密期间创建包含加密文件长度的表。比我解密确切的部分(填充)。