关闭加密流时 C# 中的 DES 解密错误“错误数据”
本文关键字:错误数据 解密 错误 DES 中的 加密 密流 | 更新日期: 2023-09-27 17:57:24
我尝试解密一个加密的字节数组(用K1加密,用K2解密)。Visual Studio 在尝试关闭我的加密流时抛出异常"错误数据"
这是我的DES解密代码片段
public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv)
{
MemoryStream ms = new MemoryStream();
DES mDES = DES.Create();
mDES.Key = key;
mDES.IV = iv;
mDES.Padding = PaddingMode.PKCS7;
CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherData, 0, cipherData.Length);
cs.Close();
Byte[] decryptedData = ms.ToArray();
return decryptedData;
}
初始向量与加密相同。我不知道为什么会发生此错误。
添加:根据Greg B的建议,我在这里发布了我的加密代码片段。加密的输出是解密的输入(两个不同的密钥)
public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv)
{
MemoryStream ms = new MemoryStream();
DES mDES = DES.Create();
mDES.Key = key;
mDES.IV = iv;
mDES.Padding = PaddingMode.PKCS7;
CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherData, 0, cipherData.Length);
cs.Close();
Byte[] decryptedData = ms.ToArray();
return decryptedData;
}
您遇到的问题来自选定的填充模式。
由于在解密密文时使用填充,因此当您检索解密的字节时,加密流会尝试删除填充。 由于您不使用加密数据的密钥,因此您将获得"垃圾"......加密流无法检测到需要删除的填充,并且操作失败并出现观察到的异常。
如果您想使用 DES 类重新定义类似 3DES 的东西,请使用 PaddingMode NONE 进行解密和以下加密步骤(因此只有第一次加密或最后一次解密使用填充)