C# AES托管文件加密和解密以及预编初始化向量

C# AES托管文件加密和解密以及预编初始化向量,c#,byte,aes,encryption-symmetric,C#,Byte,Aes,Encryption Symmetric,我正在尝试加密/解密字节-我已经使用System.Security.Cryptography中的AES托管类阅读了大量有关AES算法的密钥和IV的内容。我读了James Johnson对以下问题的回答,他建议在加密例程中使用随机IV,并在加密消息前添加IV。decrypt函数从加密消息的开头去掉随机IV以初始化解密类,然后解密其余字节。我已尝试在以下代码中执行此操作。但我一直在获取“要解密的数据长度无效”。在加密后尝试解密时出现错误消息。有没有人能解释一下可能出了什么问题 USAG

我正在尝试加密/解密字节-我已经使用System.Security.Cryptography中的AES托管类阅读了大量有关AES算法的密钥和IV的内容。我读了James Johnson对以下问题的回答,他建议在加密例程中使用随机IV,并在加密消息前添加IV。decrypt函数从加密消息的开头去掉随机IV以初始化解密类,然后解密其余字节。我已尝试在以下代码中执行此操作。但我一直在获取“要解密的数据长度无效”。在加密后尝试解密时出现错误消息。有没有人能解释一下可能出了什么问题

       USAGE: (streamToEncrypt/streamToDecrypt are System.IO.Stream)


事先非常感谢

也许您已经解决了这个问题,但我将为其他面临类似问题的人提供我的答案

由于
输入
数组中存在其他信息而发生错误。在
publicbyte[]Encrypt(byte[]input)
方法中,在写入加密数据之前写入IV length和IV。线路:

ms.Write(BitConverter.GetBytes(AESManaged.IV.Length), 0, sizeof(int));
ms.Write(AESManaged.IV, 0, AESManaged.IV.Length);
publicbyte[]Decrypt(byte[]input)
方法中,您正在读取此信息,并使用read IV作为AES算法的初始化向量。都很好。然后使用
CryptoStreamMode构建
CryptoStream
。Write
并传递
MemoryStream
对象
ms
,该对象获取解密数据。但是,传递的
输入
数组不仅包含加密消息,还包含您在加密过程中编写的IV。这就是它无法解密的原因

您需要做的是从
输入
数组中只提取密码数据,并将其传递给:
cs.Write(cipherData,0,cipherData.Length)
或将模式更改为
CryptoStreamMode.Read
并使用
cs.Read(outputBuff,0,outputBuff.Length)


另外,不要使用相同的
MemoryStream
对象进行读写,因为
CryptoStream
写入后,其中会有一些垃圾。

谢谢您的帮助-但我已经解决了这个问题,并按照您的建议做了
ms.Write(BitConverter.GetBytes(AESManaged.IV.Length), 0, sizeof(int));
ms.Write(AESManaged.IV, 0, AESManaged.IV.Length);