DES算法的C#解密方法,请大家帮帮忙
在网上看到了尹学渊的DES加密解密工具,写的非常好
网址如下
http://www.cnblogs.com/erwin/archive/2009/04/14/1435288.html
但是我不会用C#解密 主要原因还是对DES算法不太了解,我试着用DESCryptoServiceProvider解密,但在尹学渊的《DES加密解密工具》中没有找到默认密钥向量rgbIV,最后解出来的字符串都是错误的。
这个问题已经折磨我半个月了,还请高手帮帮忙啊,如何写C#代码才能解密 尹学渊的那个《DES加密解密》程序?
如果能给个提示,就非常感激了,谢谢!
我使用的方法如下:
先把十六进制转成String,然后进行比较
//默认密钥向量 private byte[] Keys = { 0xEF, 0xAB, 0x56, 0x78, 0x90, 0x34, 0xCD, 0x12 }; /// <summary> /// DES加密字符串 /// </summary> /// <param name="encryptString">待加密的字符串</param> /// <param name="encryptKey">加密密钥,要求为8位</param> /// <returns>加密成功返回加密后的字符串,失败返回源串</returns> public string EncryptDES(string encryptString, string encryptKey) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); byte[] rgbIV = Keys; byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Convert.ToBase64String(mStream.ToArray()); } catch { return encryptString; } } /// <summary> /// DES解密字符串 /// </summary> /// <param name="decryptString">待解密的字符串</param> /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param> /// <returns>解密成功返回解密后的字符串,失败返源串</returns> public string DecryptDES(string decryptString, string decryptKey) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 8)); byte[] rgbIV = Keys; byte[] inputByteArray = Convert.FromBase64String(decryptString); DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Encoding.UTF8.GetString(mStream.ToArray()); } catch { return decryptString; } }/// <summary> /// 将十六进制串转换为指定编码的字符串 /// </summary> /// <param name="hex">十六进制串</param> /// <param name="encode">要转换成的字符串的编码</param> /// <returns>指定编码的字符串</returns> public static string ConvertStringFromHex(string hex, Encoding encode) { string src = string.Empty; int len = hex.Length / 2; byte[] buffer = new byte[len]; for (int i = 0; i < len; i++) { buffer[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16); } src = encode.GetString(buffer); return src; }
/// <summary>
/// 加密字符串
/// 注意:密钥必须为8位
/// </summary>
/// <param name="strText">字符串</param>
/// <param name="encryptKey">密钥</param>
public void DesEncrypt()
{
byte[] byKey=null;
byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
try
{
byKey = System.Text.Encoding.UTF8.GetBytes(this.encryptKey.Substring(0,8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(this.inputString);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write) ;
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
this.outString=Convert.ToBase64String(ms.ToArray());
}
catch(System.Exception error)
{
this.noteMessage=error.Message;
}
}
#endregion
#region DES解密字符串
/// <summary>
/// 解密字符串
/// </summary>
/// <param name="this.inputString">加了密的字符串</param>
/// <param name="decryptKey">密钥</param>
public void DesDecrypt()
{
byte[] byKey = null;
byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
byte[] inputByteArray = new Byte[this.inputString.Length];
try
{
byKey = System.Text.Encoding.UTF8.GetBytes(decryptKey.Substring(0,8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
inputByteArray = Convert.FromBase64String(this.inputString);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
System.Text.Encoding encoding = new System.Text.UTF8Encoding();
this.outString=encoding.GetString(ms.ToArray());
}
catch(System.Exception error)
{
this.noteMessage=error.Message;
}
}
#endregion
[解决办法]
关注
[解决办法]
看看
[解决办法]
解密时保证密钥和加密向量一样就欧了