C# 解密AES流的一部分
我使用AES加密。当我加密然后解密整个文件时就可以了。我想将多个文件添加到一个加密文件中。这就是问题所在。加密可以,但解密会导致加密异常-错误的数据长度。甚至可以对文件的一部分进行解密,还是对整个文件进行加密?我使用了一个加密流,并将所有要加密的文件传递到单个文件。我正试图做相反的事情:C# 解密AES流的一部分,c#,io,cryptography,aes,C#,Io,Cryptography,Aes,我使用AES加密。当我加密然后解密整个文件时就可以了。我想将多个文件添加到一个加密文件中。这就是问题所在。加密可以,但解密会导致加密异常-错误的数据长度。甚至可以对文件的一部分进行解密,还是对整个文件进行加密?我使用了一个加密流,并将所有要加密的文件传递到单个文件。我正试图做相反的事情: AesManaged aes = AES.InitAes(key, salt); ICryptoTransform transform = aes.CreateDecryptor(aes
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;
}
}
}
}
aes=aes.InitAes(键,盐);
ICryptoTransform transform=aes.CreateDecryptor(aes.Key,aes.IV);
int defChunkSize=1024*1024*50;
使用(FileStream source=newfilestream(header.data.filename,FileMode.Open))
{
foreach(header.data.files中的CryptHeader.fileStruct文件)
{
preparePath(文件名);
使用(FileStream target=newfilestream(file.filename,FileMode.Create))
{
使用(CryptoStream CryptoStream=新的CryptoStream(目标、转换、CryptoStreamMode.Write))
{
long padding=source.Length-header.data.files.Sum(x=>x.Length);//只需测试
int chunkSize=(defChunkSize>(int)file.length)?(int)file.length:defChunkSize;
byte[]chunkData=新字节[chunkSize];
int字节读取=0;
int totalRead=0;
while(totalRead 如果(bytesRead我几年前也这样做了,没有任何问题。我使用的逻辑如下:
加密
定义文件数
定义用于保持加密大小的数组
开放输出流
查找(强制)到(文件数*4)+4(假定长度为整数)
加密循环(加密-写入加密数据-指定加密大小)
搜索到0(开始)
写入文件数
写入加密大小数组
关闭输出流
解密
开放输入流
读取文件数
使用加密大小定义读填充数组
解密循环(使用已知大小读取)
关闭输出流
我希望这能有所帮助。简而言之:“你不能从这里到达那里”,这是不可能的
如果你看一下AES如何工作的描述,你会看到两件事
1 AES使用128位的块大小,因此如果文件长度不是8字节的倍数,则附加部分中的块将不会对齐
2:AES use根据rijndael密钥计划为每个块使用不同的密钥,这很可能会成为交易的破坏者
如果您需要能够连接加密的文件,可以包装它们,以便连接可见,片段可以单独解密(压缩时gzip会这样做)或者使用一个固定的替换密码,比如rot13,它可以完成并且可以工作。我在加密过程中生成一个包含加密文件长度的表。然后我解密确切的部分(使用填充)