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