C# rijndael解密文件;要解密的数据长度无效";
我尝试为基于rijndael和CBC的文件构建一个简单的De/En加密类。加密就像一个魔咒,但当我试图读取数据时,它总是给我“要解密的数据长度无效”。关于Stackoverflow的大多数问题的答案都是“您忘记刷新最后一个块了”,或者在解密或加密时使用正确的填充,这通常是解决方案,但在我的情况下不是。(我希望如此)C# rijndael解密文件;要解密的数据长度无效";,c#,encryption,C#,Encryption,我尝试为基于rijndael和CBC的文件构建一个简单的De/En加密类。加密就像一个魔咒,但当我试图读取数据时,它总是给我“要解密的数据长度无效”。关于Stackoverflow的大多数问题的答案都是“您忘记刷新最后一个块了”,或者在解密或加密时使用正确的填充,这通常是解决方案,但在我的情况下不是。(我希望如此) 我优雅地接受我代码中的每一个解决方案或优化。也许加密并没有真正发挥出魅力。。。您是否尝试过用其他软件加密或解密您的文件?您可以使用软件X进行加密,然后让您的代码解密,或者反之亦然,以
我优雅地接受我代码中的每一个解决方案或优化。也许加密并没有真正发挥出魅力。。。您是否尝试过用其他软件加密或解密您的文件?您可以使用软件X进行加密,然后让您的代码解密,或者反之亦然,以验证错误所在。在加密然后解密文件时,您的代码似乎工作正常,将从
encrypt()
返回的密钥对立即传递到decrypt()
。这表明在您的测试中,解密方法使用的密钥/IV与最初加密数据时使用的密钥/IV不同。
public int BlockSize { get; set; } = 128;
public int IVSize { get; set; } = 256;
public Stream Decrypt(KeyPair pair, string file)
{
if (pair?.IV == null || pair.Key == null)
{
throw new ArgumentException("Key missing");
}
var returningStream = new MemoryStream();
using (var myRij = new RijndaelManaged())
{
myRij.IV = pair.IV;
myRij.Key = pair.Key;
myRij.Mode = CipherMode.CBC;
myRij.Padding = PaddingMode.PKCS7;
var decrypt = myRij.CreateDecryptor();
using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
using (var cryptoStream = new CryptoStream(fileStream, decrypt, CryptoStreamMode.Read))
{
var buffer = new byte[64];
var read = cryptoStream.Read(buffer, 0, buffer.Length);
while (read > 0)
{
returningStream.Write(buffer, 0, read);
// I think the last Iteration is failing...
// Also cryptoStream.CopyTo(returningStream) throws the exception
read = cryptoStream.Read(buffer, 0, buffer.Length);
}
}
}
returningStream.Position = 0;
return returningStream;
}
public KeyPair Encrypt(string file, string outfile)
{
using (RijndaelManaged myRijndael = new RijndaelManaged())
{
// Generate new IV and KEY
myRijndael.KeySize = IVSize;
myRijndael.BlockSize = BlockSize;
myRijndael.Padding = PaddingMode.PKCS7;
myRijndael.Mode = CipherMode.CBC;
myRijndael.GenerateIV();
myRijndael.GenerateKey();
var encrypter = myRijndael.CreateEncryptor();
// Create memoryspace for crypto
using (var memory = new MemoryStream())
{
// Create cryptostream
using (var cryptoStream = new CryptoStream(memory, encrypter, CryptoStreamMode.Write))
{
// read file to encrypt
using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
{
// copy content to cryptostream
var buffer = new byte[64];
var read = fileStream.Read(buffer, 0, buffer.Length);
while (read > 0)
{
cryptoStream.Write(buffer, 0, read);
read = fileStream.Read(buffer, 0, buffer.Length);
}
cryptoStream.FlushFinalBlock();
}
using (var encryptedFile = new FileStream(outfile, FileMode.CreateNew, FileAccess.Write))
{
// Reset the stream position for reading
memory.Position = 0;
// read and copy content to file
memory.CopyTo(encryptedFile);
}
}
}
return new KeyPair {IV = myRijndael.IV, Key = myRijndael.Key};
}
}