【问题标题】:Decrypting part of AES stream解密部分 AES 流
【发布时间】:2013-02-03 19:40:46
【问题描述】:

我使用 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;
                        }
                    }
                }
            }    

【问题讨论】:

    标签: c# io cryptography aes


    【解决方案1】:

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

    加密

    1. 定义文件数

    2. 定义数组以保持加密大小

    3. 打开输出流

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

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

    6. 寻找到 0(开始)

    7. 写入文件数

    8. 写入加密大小数组

    9. 关闭输出流

    解密

    1. 打开输入流

    2. 读取文件数

    3. 使用加密大小定义读取填充数组

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

    5. 关闭输出流

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-22
          • 2021-02-11
          • 2012-02-24
          • 1970-01-01
          • 2020-11-29
          • 1970-01-01
          相关资源
          最近更新 更多