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