积极答复者
c# 多重DES错误,即内存流使用K1密钥加密后,无法使用K2密钥进行解密。K1不等于K2

问题
-
c# 多重DES错误,即内存流使用K1密钥加密后,无法使用K2密钥进行解密。
我想设计个多重的DES来使用,比如5重,那么就是K1加密 K2解密 K3加密 K4解密 K5加密
注意是多重,不是多次,
但是现在K1加密成功,K2就解密不了了,说不正确数据,自己上网找了很多资料还是没有办法解决,花了不少时间了。请各位师傅和师兄们帮帮忙。
错误在:在使用K1密钥内存流加密后,接着使用K2密钥内存流解密时,出现“不正确数据”
就是解密中的这句 CS.FlushFinalBlock();
我自己做过测试,如果对没有加过密的进行DES也是这样的错误,是否微软对DES加密设置有文件保护功能,只有 可以解密的且密钥是加密的密钥的才可以进行DES解密操作。寻求师傅的帮助。
全球第一大的IT论坛也解决不了的话,我放弃了!!
以下是源码,密钥和向量存放在KeyIV中,前面是密钥,最后一个是向量。
唉,但是我也很不抱有希望。。。唉,,准备放弃了!!!!!
#region 多重DES加密
/// <summary>
/// 多重DES加密
/// </summary>
/// <param name="KeyIV">密钥向量集</param>
/// <param name="desCount">重数</param>
/// <param name="values">要加密的字节数组</param>
/// <returns></returns>
public byte[] MuDES_EN(byte[][] KeyIV, int desCount, byte[] values)
{
try
{
byte[] MDesByte;
//加密第一次
MDesByte = CreateEncryptByte(KeyIV[0], KeyIV[desCount], values);
//按照重数-1循环加解密
for(int i=1;i<desCount;i++)
{
//解密
MDesByte = CreateDescryptByte(KeyIV[i], KeyIV[desCount], MDesByte);
i = i + 1;
//加密
MDesByte = CreateEncryptByte(KeyIV[i], KeyIV[desCount], MDesByte);
}
return MDesByte;
}
catch
{
return null;
}
}
#endregion
#region 加密字节数组(标准DES)
/// <summary>
/// 加密字节数组(标准DES)
/// </summary>
/// <param name="key">密钥</param>
/// <param name="iV">向量</param>
/// <param name="values">要加密的字节数组</param>
/// <returns></returns>
public static byte[] CreateEncryptByte(byte[] key, byte[] iV, byte[] values)
{
try
{
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = key;
des.IV = iV;
System.IO.MemoryStream ms = new System.IO.MemoryStream(values);
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
ms.Flush();
cs.Write(values, 0, values.Length);
cs.FlushFinalBlock();
cs.Close();
}
//加密流转换成字节流
byte[] buffer = ms.ToArray();
//关闭内存流
ms.Flush();
ms.Close();
des.Clear();
//返回已加密的字节数组
return buffer;
}
}
catch
{
//解密不成功,返回NULL
return null;
}
}
#endregion
#region 解密字节数组(标准DES)
/// <summary>
/// 解密字节数组(标准DES)
/// </summary>
/// <param name="key">密钥</param>
/// <param name="iV">向量</param>
/// <param name="values">要解密的字节数组</param>
/// <returns></returns>
public static byte[] CreateDescryptByte(byte[] key, byte[] iV, byte[] values)
{
try
{
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = key;
des.IV = iV;
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
ms.Flush();
//ms.Close();
cs.Write(values, 0, values.Length);
cs.FlushFinalBlock();
cs.Close();
}
//解密流转换成字节流
byte[] buffer = ms.ToArray();
ms.Flush();
//关闭内存流
ms.Close();
//返回已加密的字节数组
return buffer;
}
}
catch
{
//解密不成功,返回NULL
return null;
}
}
#endregion
答案
-
你好,
我试了三重DES加密,所使用的代码是引用这篇博文的,http://www.cnblogs.com/weekzero/archive/2007/12/05/983143.html。使用K1加密,K2解密再用K3加密。然后解密时用K3解密,K2加密,开用K1解密,可以得到正确的结果。
不知道楼主可否试下博文中的代码。
谢谢!
Michael Sun [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
- 已建议为答案 Michael Sun [MSFT]Microsoft employee 2011年9月12日 1:10
- 已标记为答案 Alan_chenModerator 2011年10月3日 2:22
全部回复
-
Hi 叶茂,
我们正在研究你的问题, 一旦有结果就会马上通知你.
祝你快乐每一天,
Leo Liu [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
-
你好,
我试了三重DES加密,所使用的代码是引用这篇博文的,http://www.cnblogs.com/weekzero/archive/2007/12/05/983143.html。使用K1加密,K2解密再用K3加密。然后解密时用K3解密,K2加密,开用K1解密,可以得到正确的结果。
不知道楼主可否试下博文中的代码。
谢谢!
Michael Sun [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
- 已建议为答案 Michael Sun [MSFT]Microsoft employee 2011年9月12日 1:10
- 已标记为答案 Alan_chenModerator 2011年10月3日 2:22
-
你好,
我试了三重DES加密,所使用的代码是引用这篇博文的,http://www.cnblogs.com/weekzero/archive/2007/12/05/983143.html。使用K1加密,K2解密再用K3加密。然后解密时用K3解密,K2加密,开用K1解密,可以得到正确的结果。
不知道楼主可否试下博文中的代码。
这个博客的DES方法和我写的是一样的。你没有仔细看过代码吧。
-
你好,
算法一样,但这篇博客里使用的是string为参数,我测试下来可以得到正确的结果。但是你的代码时转换为Byte数组的。
谢谢!
Michael Sun [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.