C# RijndaelManaged-在C中加密/解密流#
我试图加密和解密一个流(基本上是一个PDF文档),但我遇到了一些问题。当我尝试在解密和下载后打开文档时,出现错误无法加载PDF文档 你知道为什么会这样吗 以下是加密代码:C# RijndaelManaged-在C中加密/解密流#,c#,pdf,encryption,stream,rijndaelmanaged,C#,Pdf,Encryption,Stream,Rijndaelmanaged,我试图加密和解密一个流(基本上是一个PDF文档),但我遇到了一些问题。当我尝试在解密和下载后打开文档时,出现错误无法加载PDF文档 你知道为什么会这样吗 以下是加密代码: public EncryptResult EncryptStream(Stream dataStream, bool reuseIV = false) { RijndaelManaged crypto = new RijndaelManaged(); crypto.Key = _key;
public EncryptResult EncryptStream(Stream dataStream, bool reuseIV = false)
{
RijndaelManaged crypto = new RijndaelManaged();
crypto.Key = _key;
if (!reuseIV || _iv == null)
{
// make a copy of the current IV
_iv = crypto.IV;
}
else
{
// reuse the previous IV
crypto.IV = _iv;
}
var result = new EncryptResult() { IV = crypto.IV };
using (var encryptor = crypto.CreateEncryptor())
{
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
var byteArrayInput = new byte[dataStream.Length];
dataStream.Read(byteArrayInput, 0, byteArrayInput.Length);
csEncrypt.Write(byteArrayInput, 0, byteArrayInput.Length);
dataStream.Close();
result.Cipher = msEncrypt.ToArray();
msEncrypt.Flush();
msEncrypt.Position = 0;
return result;
}
}
}
}
和解密:
public Stream DecryptStream(byte[] cipher, byte[] iv)
{
RijndaelManaged crypto = new RijndaelManaged();
crypto.Key = _key;
crypto.IV = iv;
crypto.Padding = PaddingMode.Zeros;
using (var decryptor = crypto.CreateDecryptor())
{
using (MemoryStream msDecrypt = new MemoryStream(cipher))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
var sOutputFilename = new MemoryStream();
var fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(csDecrypt).ReadToEnd());
sOutputFilename.Position = 0;
return sOutputFilename;
}
}
}
}
提前谢谢
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
//var byteArrayInput = new byte[dataStream.Length];
//dataStream.Read(byteArrayInput, 0, byteArrayInput.Length);
//csEncrypt.Write(byteArrayInput, 0, byteArrayInput.Length);
dataStream.CopyTo(csEncrypt);
dataStream.Close();
//result.Cipher = msEncrypt.ToArray(); // not here - not flushed yet
//msEncrypt.Flush(); // don't need this
//msEncrypt.Position = 0;
}
result.Cipher = msEncrypt.ToArray();
return result;
}
在解密程序中,清除所有StreamReader/StreamWriter内容。
PDF文件是压缩的,即二进制文件。但这是在解密之后,所以这不可能是你的错误
using (var decryptor = crypto.CreateDecryptor())
{
using (MemoryStream msDecrypt = new MemoryStream(cipher))
{
var outputStream = new MemoryStream();
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
csDecrypt.CopyTo(outputStream );
}
outputStream .Position = 0;
return outputStream ;
}
}
一个问题是,您可能在流的末尾加密多余的字节,您需要计算出读取或使用了多少字节 从当前流中读取字节并将其写入另一个流 小溪
请解释一下?在我看来,这是一个完全合理的问题。除了尝试在PDF查看器中打开结果外,您是否进行过任何结果检查?特别是,您是否比较了输入和输出?它们的大小差不多吗?你比较过字节本身吗?仅仅是一些错误还是全部错误?请注意,根据流和实现,
dataStream.Read(byteArrayInput,0,byteArrayInput.Length)代码>不能读取字节数。长度<代码>字节数。这就是它返回一个值的原因。同意,我复制了这个问题的形式,可能不是这里的根本问题。现在已修复。请解释OPs代码是如何“…可能在流的末尾加密多余的字节…”。