C# 解密AES流的一部分

C# 解密AES流的一部分,c#,io,cryptography,aes,C#,Io,Cryptography,Aes,我使用AES加密。当我加密然后解密整个文件时就可以了。我想将多个文件添加到一个加密文件中。这就是问题所在。加密可以,但解密会导致加密异常-错误的数据长度。甚至可以对文件的一部分进行解密,还是对整个文件进行加密?我使用了一个加密流,并将所有要加密的文件传递到单个文件。我正试图做相反的事情: AesManaged aes = AES.InitAes(key, salt); ICryptoTransform transform = aes.CreateDecryptor(aes

我使用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,它可以完成并且可以工作。我在加密过程中生成一个包含加密文件长度的表。然后我解密确切的部分(使用填充)