C# 将CryptoStream编码为C中的块中的Base64字符串#

C# 将CryptoStream编码为C中的块中的Base64字符串#,c#,asp.net,base64,chunks,cryptostream,C#,Asp.net,Base64,Chunks,Cryptostream,有一个方法(Version1)对输入流进行编码,还有一个函数Decrypt()成功解码编码数据。但当输入数据较大时,可能会出现错误OutOfMemory(在“string textEncrypted=Convert.ToBase64String(ms.ToArray())”行上) 版本1 private static Stream EncryptRijndael1(byte[] key, byte[] iv, Stream plainText) { if (pla

有一个方法(Version1)对输入流进行编码,还有一个函数Decrypt()成功解码编码数据。但当输入数据较大时,可能会出现错误OutOfMemory(在“string textEncrypted=Convert.ToBase64String(ms.ToArray())”行上)

版本1

    private static Stream EncryptRijndael1(byte[] key, byte[] iv, Stream plainText)
    {
        if (plainText == null)
            return null;

        byte[] bytesEncrypted;

        RijndaelManaged rjndl = RijndaelManagedWithConfig(key, iv);

        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, rjndl.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                byte[] buffer = new byte[16 * 1024];
                int readed;
                while ((readed = (plainText.Read(buffer, 0, buffer.Length))) > 0)
                {
                    cs.Write(buffer, 0, readed);
                }
            }
            string textEncrypted = Convert.ToBase64String(ms.ToArray());
            bytesEncrypted = Encoding.ASCII.GetBytes(textEncrypted);
        }
        return new MemoryStream(bytesEncrypted);
    }
因此,我修改了该方法以逐部分(块)处理数组。 这里是第2版。它会导致错误“偏移量和长度必须参考Convert.ToBase64String(ms.ToArray(),offset,read)行中字符串“中的位置。”

Version2

    private static Stream EncryptRijndael2(byte[] key, byte[] iv, Stream plainText)
    {
        if (plainText == null)
            return null;

        byte[] bytesEncrypted;

        RijndaelManaged rjndl = RijndaelManagedWithConfig(key, iv);

        string textEncrypted = String.Empty;

        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, rjndl.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                byte[] buffer = new byte[16 * 1024];
                int readed;
                int offset = 0;
                while ((readed = (plainText.Read(buffer, 0, buffer.Length))) > 0)
                {
                    cs.Write(buffer, 0, readed);
                    textEncrypted += Convert.ToBase64String(ms.ToArray(), offset, readed);
                    offset += readed;
                }
            }

            bytesEncrypted = Encoding.ASCII.GetBytes(textEncrypted);

        }

        return new MemoryStream(bytesEncrypted);
    }
然后我制作了第三版。它可以正常工作,但现在的输出数据长度大于具有相同输入数据的Version1。 函数的Decryt()抛出一个错误“输入不是有效的Base-64字符串,因为它包含一个非Base-64字符、两个以上的填充字符或填充字符中的非法字符。”

版本3

    private static Stream EncryptRijndael3(byte[] key, byte[] iv, Stream plainText)
    {
        if (plainText == null)
            return null;

        byte[] bytesEncrypted;

        RijndaelManaged rjndl = RijndaelManagedWithConfig(key, iv);

        using (MemoryStream ms = new MemoryStream())
        {
            string textEncrypted = String.Empty;
            using (CryptoStream cs = new CryptoStream(ms, rjndl.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                byte[] buffer = new byte[16*1024];
                int readed;
                while ((readed = (plainText.Read(buffer, 0, buffer.Length))) > 0)
                {
                    cs.Write(buffer, 0, readed);
                }
             }


                byte[] buffer1 = new byte[16*1024];
                int readed1;
                using (MemoryStream ms1 = new MemoryStream(ms.ToArray()))
                {
                    while ((readed1 = (ms1.Read(buffer1, 0, buffer1.Length))) > 0)
                    {
                        if (readed1 < buffer1.Length)
                        {
                            var lastBuf = new List<Byte>();
                            for (int i = 0; i < readed1; i++)
                            {
                                lastBuf.Add(buffer1[i]);
                            }
                            textEncrypted += Convert.ToBase64String(lastBuf.ToArray());
                            continue;
                        }
                        textEncrypted += Convert.ToBase64String(buffer1);
                    }
                 }

            bytesEncrypted = Encoding.ASCII.GetBytes(textEncrypted);
        }

        return new MemoryStream(bytesEncrypted);
    }

请帮助我消除错误,或告诉我如何使Version1进程转换。TOBASE64字符串数据部分

我已做出决定

         private static Stream EncryptRijndael(byte[] key, byte[] iv, Stream plainText)
    {
        if (plainText == null)
            return null;

        byte[] buffer = new byte[5120 * 1024];

        RijndaelManaged rjndl = RijndaelManagedWithConfig(key, iv);

        using (var memoryStream = new MemoryStream())
        {
            int readedBytes;
            using (var cs = new CryptoStream(memoryStream, rjndl.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                while ((readedBytes = (plainText.Read(buffer, 0, buffer.Length))) > 0)
                {
                    cs.Write(buffer, 0, readedBytes);
                }
            }


            using (var cryptoMemoryStream = new MemoryStream(memoryStream.ToArray()))
            {
                using (var base64MemoryStream = new MemoryStream())
                {
                    using (ICryptoTransform transform = new ToBase64Transform())
                    {
                        using (var cryptStream = new CryptoStream(base64MemoryStream, transform, CryptoStreamMode.Write))
                        {
                            while ((readedBytes = cryptoMemoryStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                cryptStream.Write(buffer, 0, readedBytes);
                            }
                            cryptStream.FlushFinalBlock();
                        }

                        return new MemoryStream(base64MemoryStream.ToArray());
                    }
                }
            }
        }
    }

我已经做出了决定

         private static Stream EncryptRijndael(byte[] key, byte[] iv, Stream plainText)
    {
        if (plainText == null)
            return null;

        byte[] buffer = new byte[5120 * 1024];

        RijndaelManaged rjndl = RijndaelManagedWithConfig(key, iv);

        using (var memoryStream = new MemoryStream())
        {
            int readedBytes;
            using (var cs = new CryptoStream(memoryStream, rjndl.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                while ((readedBytes = (plainText.Read(buffer, 0, buffer.Length))) > 0)
                {
                    cs.Write(buffer, 0, readedBytes);
                }
            }


            using (var cryptoMemoryStream = new MemoryStream(memoryStream.ToArray()))
            {
                using (var base64MemoryStream = new MemoryStream())
                {
                    using (ICryptoTransform transform = new ToBase64Transform())
                    {
                        using (var cryptStream = new CryptoStream(base64MemoryStream, transform, CryptoStreamMode.Write))
                        {
                            while ((readedBytes = cryptoMemoryStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                cryptStream.Write(buffer, 0, readedBytes);
                            }
                            cryptStream.FlushFinalBlock();
                        }

                        return new MemoryStream(base64MemoryStream.ToArray());
                    }
                }
            }
        }
    }

您的数据有多大?大多数机器都能处理2Gb文件的加密。不,我试着对300 Mb的输入数据进行编码。300 Mb对于现代机器来说是微不足道的(通常有4-16Gb的RAM)。我知道。。。我想优化转换为Base64String,但我的修改版本1中没有一个不能正常工作。您的数据有多大?大多数机器都能处理2Gb文件的加密。不,我试着对300 Mb的输入数据进行编码。300 Mb对于现代机器来说是微不足道的(通常有4-16Gb的RAM)。我知道。。。我想优化转换为Base64String,但我的修改版本1中没有一个不能正常工作。