我的要求如下。 步骤1)我想通过加密10-10 MB的块来在本地文件系统中写入101 MB数据。
步骤2)在解密时,我想从文件中获取10-10 MB的数据并想要解密并希望将10-10 MB的密码解密到其他一些函数(注意:我的上一个块大小将是1 MB文件大小为101 MB)。
所以
1)当我尝试仅解密10 MB时,它会出现错误“填充无效且无法删除”
2)现在,在解密时,如果我将paddingMode赋予None,那么当最后一个块到来时,即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();
}
}
}
}
解密只有块并返回byte []代码 - 错误
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函数返回byte []。
我多次调用此函数,直到文件大小变为0.即每个块。 enter code here
有人可以帮助我吗?
我想只返回10-10 MB。
答案 0 :(得分:0)
输入必须是块大小倍数或必须使用填充。填充仅添加最后加密的块。请参阅PKCS#7 padding。
如果一次读取文件的某些部分,请确保块大小是块大小的倍数。在读取时,除了文件的最后一个块之外,不为所有块指定填充,并为文件的最后一个块指定填充。
更新:您正在使用CBC模式,因为您正在使用IV。在这种情况下,对于第一个块之外的所有块,IV将是前一个块。只需阅读上一个块并将其用于IV。请参阅CBC mode。