C# CryptoStream的数组边界错误。读取

C# CryptoStream的数组边界错误。读取,c#,stream,cryptography,buffer,cryptostream,C#,Stream,Cryptography,Buffer,Cryptostream,我有一个服务器/客户机系统,它在服务器(python)上加密图像,在客户机(c#)上解密图像。加密部分工作得很好,除了尝试解密几个块长的信息(例如,一个图像,而不是“Hello World”字符串) 所以,当我试图通过加密流解密加密图像时- 有时它有效,但出于某种原因——有时不起作用 这是图像的解密过程: public static byte[] DecryptBytesFromBytes(byte[] encryptedImage, byte[] key) {

我有一个服务器/客户机系统,它在服务器(python)上加密图像,在客户机(c#)上解密图像。加密部分工作得很好,除了尝试解密几个块长的信息(例如,一个图像,而不是“Hello World”字符串)

所以,当我试图通过加密流解密加密图像时- 有时它有效,但出于某种原因——有时不起作用

这是图像的解密过程:

public static byte[] DecryptBytesFromBytes(byte[] encryptedImage, byte[] key)
        {
            byte[] decryptedImage;

            // Create an Aes object with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = key;
                aesAlg.Padding = PaddingMode.Zeros;
                aesAlg.Mode = CipherMode.CBC;

                byte[] IV = new byte[16];
                byte[] cipherBytes = new byte[encryptedImage.Length - IV.Length];

                Array.Copy(encryptedImage, IV, IV.Length);
                Array.Copy(encryptedImage, IV.Length, cipherBytes , 0, cipherBytes.Length);

                aesAlg.IV = IV;

                // Create a decryptor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                using (var input = new MemoryStream(cipherBytes))
                using (var output = new MemoryStream())
                {
                    using (var cryptStream = new CryptoStream(input, decryptor, CryptoStreamMode.Read))
                    {
                        var buffer = new byte[1024];
                        var read = cryptStream.Read(buffer, 0, buffer.Length);
                        while (read > 0)
                        {
                            output.Write(buffer, 0, read);
                            read = cryptStream.Read(buffer, 0, buffer.Length); // Error here
                        }
                        decryptedImage= output.ToArray();
                    }
                }
                return decryptedImage;
            }
如果有帮助,即使在执行以下操作时,我也会遇到相同的错误:

cryptStream.CopyTo(output);
这是用于加密的python代码:

@staticmethod
def pad(s):
    return s + b"\0" * (AES.block_size - len(s) % AES.block_size)

def encrypt(self, message):
    message = self.pad(message)
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(str.encode(self.key), AES.MODE_CBC, iv)
    return iv + cipher.encrypt(message)
例外 有时会出现以下错误:
System.ArgumentException:偏移量和长度超出了数组的界限,或者计数大于从索引到源集合末尾的元素数。

完整堆栈跟踪:

at System.Buffer.BlockCopy (System.Array src, System.Int32 srcOffset, System.Array dst, System.Int32 dstOffset, System.Int32 count) [0x00097] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at Mono.Security.Cryptography.SymmetricTransform.InternalTransformBlock (System.Byte[] inputBuffer, System.Int32 inputOffset, System.Int32 inputCount, System.Byte[] outputBuffer, System.Int32 outputOffset) [0x000b0] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at Mono.Security.Cryptography.SymmetricTransform.FinalDecrypt (System.Byte[] inputBuffer, System.Int32 inputOffset, System.Int32 inputCount) [0x00020] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at Mono.Security.Cryptography.SymmetricTransform.TransformFinalBlock (System.Byte[] inputBuffer, System.Int32 inputOffset, System.Int32 inputCount) [0x0002e] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at System.Security.Cryptography.CryptoStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 count) [0x002e3] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at Project.Crypto.DecryptBytesFromBytes (System.Byte[] encryptedImage, System.Byte[] key) [0x000b9] in C:\Users\user\Desktop\Project\Crypto.cs:129 
顺便说一下,我使用CBC模式和零填充


我想澄清最后一件事——我做这整个过程只是为了能够获取加密的字节,并将它们转换为解密的字节。如果有其他方法可以在c#中将字节解密为字节,请告诉我

加密文件时是否
.FlushFinalBlock()
?否。解释起来有点复杂,但是文件是用python加密的(在服务器上)。加密时,
FlushFinalBlock()
的作用是什么@我明白了。你应该这样做。。。你能给我进一步的信息吗?我应该在哪里做?它实际上做什么@JQSOFT是最后一行。如果正在使用,{..}块关闭和处理流或
中的最后一行(如果正在使用它),则在关闭和处理流之前。加密文件时是否执行
.FlushFinalBlock()
操作?否。解释起来有点复杂,但是文件是用python加密的(在服务器上)。加密时,
FlushFinalBlock()
的作用是什么@我明白了。你应该这样做。。。你能给我进一步的信息吗?我应该在哪里做?它实际上做什么@JQSOFT是最后一行。在关闭和处理流或
使用{..}
块中的最后一行(如果正在使用)之前。
// Exceptions:
//   T:System.ArgumentException:
//     Thesum of the count and offset parameters is longer than the length of the buffer.