C# RijndaelManaged-在C中加密/解密流#

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;

我试图加密和解密一个流(基本上是一个PDF文档),但我遇到了一些问题。当我尝试在解密和下载后打开文档时,出现错误无法加载PDF文档

你知道为什么会这样吗

以下是加密代码:

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代码是如何“…可能在流的末尾加密多余的字节…”。