我使用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;
}
}
}
}
答案 0 :(得分:2)
<强>加密强>
定义文件数
定义用于保持加密大小的数组
打开输出流
寻求(强制)到(文件数* 4)+ 4(假设长度为整数)
加密循环(加密 - 写入加密数据 - 分配加密大小)
寻求0(开始)
写入文件数
写入加密的大小数组
关闭输出流
<强>解密强>
打开输入流
读取文件数
具有加密大小的define-read-fill数组
解密循环(使用已知尺寸读取)
关闭输出流
我希望这会有所帮助。
答案 1 :(得分:0)
简短形式:“你不能从这里到达那里”,这是不可能的。
如果你看一下AES如何工作的描述,你会看到两件事。
1 AES使用128位的块大小,因此如果您的文件长度不是8字节的倍数,则附加部分中的块将不会对齐,
2:AES使用根据rijndael密钥计划为每个块使用不同的密钥,这可能是一个交易破坏者。
如果你需要能够连接加密文件,请将它们包装起来,以便连接可见,并且片段可以单独解密(gzip在压缩时执行此操作)或使用固定的替换密码,如rot13
答案 2 :(得分:0)
可以做到并且它正在发挥作用。我在加密期间创建包含加密文件长度的表。比我解密确切的部分(填充)。