填充是无效的,不能删除例外,并且解密数据的长度无效.Rijndael



我的要求如下。步骤1)我想在本地文件系统中编写101 MB数据,通过将其加密在10-10 MB的块中。

步骤2)解密时,我想从文件中获取10-10 mb数据,并希望解密并希望通过10-10 mb将其解密到其他功能(请注意:我的最后一个块大小是1 MB,文件大小为101 MB)。

so

1)当我尝试仅解密10 MB时,会出现错误"填充无效,无法删除"

2)现在,当我解密时,如果我将paddingmode提供给无效,那么当最后一个块出现时,即1 MB会出现错误"解密数据的长度无效"。最多100 MB的事情正在起作用

注意:1)多达100 MB的事情正常工作。如果我给出最后一个大小10 MB而不是1 MB,则其工作原理,但最终我的目标文件大小将是110 MB而不是101 MB。2)我在加密时没有提供填充模式,而是要避免填充是无效的错误,而解密我的填充模式是无效的。临时我已经评论了该代码。

3)我使用相同的密钥,而IV进行加密和解密

加密代码:

private void WriteStreamInChunks(Stream fsstream, string filePath)
    {   
        int chunkSize = 10 * 1024 * 1024;
        byte[] buffer = new byte[chunkSize];
        using (var rijndaelManaged = new RijndaelManaged())
        {
            var encryptor = rijndaelManaged.CreateEncryptor(EncryptionKey, EncryptionIV);
            using (var fileStream = File.Create(filePath))
            {
                using (var cryptoStream = new CryptoStream(fileStream, encryptor, CryptoStreamMode.Write))
                {
                    int bytesRead;
                    while ((bytesRead = fsstream.Read(buffer, 0, chunkSize)) > 0)
                    {
                        cryptoStream.Write(buffer, 0, bytesRead);
                    }
                    if (!cryptoStream.HasFlushedFinalBlock)
                        cryptoStream.FlushFinalBlock();
                }
            }
        }
    }

仅解密并返回字节[]代码 - 错误

"填充无效",如果我设置了填充模式零,则数据的长度无效。

public byte[] GetDecryptedFileContent(string filePath, long chunkSizeInBytes, long seekValue, long fileSize, string encryptionIV)
    {
        var sourceFile = new FileInfo(filePath);
        var buffer = new byte[chunkSizeInBytes];
        byte[] encryptionKey = File.ReadAllBytes(Utils.GetSymmetricAlgoEncryptionKey());
        using (var fileStream = File.Open(sourceFile.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            fileStream.Seek(seekValue, SeekOrigin.Begin);
            using (var binaryReader = new BinaryReader(fileStream))
            {
                binaryReader.Read(buffer, 0, buffer.Length);
            }
        }
        using (MemoryStream dataOut = new MemoryStream())
        {
            using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
            {
                //rijndaelManaged.Padding = PaddingMode.None;
                ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(encryptionKey, Convert.FromBase64String(encryptionIV));
                using (CryptoStream cryptoStream = new CryptoStream(dataOut, decryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(buffer, 0, buffer.Length);
                    return dataOut.ToArray();
                }
            }
        }
        return null;
    }

根据我的要求,我必须从此getDecryptedFileContent函数中返回字节[]。我正在多个时间调用此功能,直到文件大小为0。即对于每个块。enter code here有人可以帮我吗?

我只想返回10-10 mb。

输入必须是块大小或必须使用填充。仅添加填充的最后一个块加密。请参阅PKCS#7填充。

如果一次读取文件的部分,请确保块大小是块大小的倍数。阅读时,除了文件的最后一个块外,没有为所有块指定所有块,并为文件的最后一个块指定填充。

更新:看来您正在使用CBC模式,因为您正在使用iv。在第一个块以外的所有块中,IV将是上一个块。只需阅读上一个块并将其用于IV即可。请参阅CBC模式。

相关内容

  • 没有找到相关文章

最新更新