c# 多重DES错误,即内存流使用K1密钥加密后,无法使用K2密钥进行解密。
我想设计个多重的DES来使用,比如5重,那么就是K1加密 K2解密 K3加密 K4解密 K5加密注意是多重,不是多次,
但是现在K1加密成功,K2就解密不了了,说不正确数据,自己上网找了很多资料还是没有办法解决,花了不少时间了。请各位师傅和师兄们帮帮忙。以下是源码,密钥和向量存放在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来使用,比如5重,那么就是K1加密 K2解密 K3加密 K4解密 K5加密注意是多重,不是多次,
但是现在K1加密成功,K2就解密不了了,说不正确数据,自己上网找了很多资料还是没有办法解决,花了不少时间了。请各位师傅和师兄们帮帮忙。以下是源码,密钥和向量存放在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
解决方案 »
- 为什么F5后,程序闪一下就关闭了?
- 问个dataGridView数据绑定的问题
- C# 不懂的语法结构求高手,在线等
- C#的Crystal reports
- 各位前辈帮帮忙,问一个关于PDA的问题,在线等谢谢!
- Regex怎么用?
- WeifenLuo.WinFormsUI.DockContent
- 怎样在最短的时间培训新人掌握C#及.Net技术?继续讨论中...一千分....等着你哦!
- 我只要装了金山毒霸,我的vs.net帮助就会出问题。你们都用什么病毒防火墙呀?!
- C#中使用ADO.NET连接数据库,为何不能引用ADO?也就是using System.Data.ADO死活无法编译,为何?
- 如何设定窗口句柄不被改变
- C#的Form从哪段代码开始绘制窗口
就是解密中的这句 CS.FlushFinalBlock();
我自己做过测试,如果对没有加过密的进行DES也是这样的错误,是否微软对DES加密设置有文件保护功能,只有 可以解密的且密钥是加密的密钥的才可以进行DES解密操作。寻求师傅的帮助。
全球第一大的IT论坛也解决不了的话,我放弃了!!