今天刚接触DES,有很多问题搞不懂,希望各位高手解答下:
第一:DES的密钥是不是只能是8位?在VS2005中网上查了不少方法可是基本密钥都限死在8位,我的BOSS却提供了一个14位的密钥,另我很头痛,如果可以大于8位,希望热心网友贴出来,学习一下
第二:DES生成的密码是不是固定的!我在VS大于8位的密码才会生成32位的密码,可是BOSS说他那边固定16位的,我又郁闷了,还是请高手解答。
我用的是VS2005的方法!
第一:DES的密钥是不是只能是8位?在VS2005中网上查了不少方法可是基本密钥都限死在8位,我的BOSS却提供了一个14位的密钥,另我很头痛,如果可以大于8位,希望热心网友贴出来,学习一下
第二:DES生成的密码是不是固定的!我在VS大于8位的密码才会生成32位的密码,可是BOSS说他那边固定16位的,我又郁闷了,还是请高手解答。
我用的是VS2005的方法!
/// 进行DES加密。
/// </summary>
/// <param name="pToEncrypt">要加密的字符串。</param>
/// <param name="sKey">密钥,且必须为8位。</param>
/// <returns>以Base64格式返回的加密字符串。</returns>
public string Encrypt(string pToEncrypt, string sKey)
{
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
string str = Convert.ToBase64String(ms.ToArray());
ms.Close();
return str;
}
} /**/
/// <summary>
/// 进行DES解密。
/// </summary>
/// <param name="pToDecrypt">要解密的以Base64</param>
/// <param name="sKey">密钥,且必须为8位。</param>
/// <returns>已解密的字符串。</returns>
//public string Decrypt(string pToDecrypt, string sKey)
//{
// byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
// using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
// {
// des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
// des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
// System.IO.MemoryStream ms = new System.IO.MemoryStream();
// using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
// {
// cs.Write(inputByteArray, 0, inputByteArray.Length);
// cs.FlushFinalBlock();
// cs.Close();
// }
// string str = Encoding.UTF8.GetString(ms.ToArray());
// ms.Close();
// return str;
// }
//}
http://topic.csdn.net/u/20090501/18/d448ae36-41d6-4dd3-9969-30617f06841d.html
如果明天你还米的更好的答案,我再给你
拿你 Boss 的 Delphi 版解密算法过来,转成 C# 版的就是
用的是不是3DES加密,和DES有所区别,最小密钥长度是14位
后面会出现两个特殊字符,补足八位,哪位高手提示下怎么在C#里加密时关闭或者处理掉这些特殊字符!~非常感谢大家的帮助
你的BOSS用的是3DES的ECB模式delphi的代码
http://topic.csdn.net/t/20050913/14/4266426.htmlC#的代码
http://liuzongan.javaeye.com/blog/443069
给以后的初学者一点提示:
delphi的DES模式一般默认为ECB模式,而C#你不声明模式的话,它会是CBC模式,这就是为什么C#默认会有个IV偏移量的问题,而ECB中是没有IV这一说的,其次了解DES算法的人都知道,当明文不是8的整数倍时会自动补足,问题来了,在C#中默认缺几位补缺位数值,如缺3位,那么后面是#3#3#3代替,delphi中却是以0补齐8位,所以要定义补齐的方式;两句话花了我一天时间
加密代码:
public string Encrypt(string pToEncrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
des.Key = Encoding.UTF8.GetBytes(sKey.Substring(0, 8));
des.Mode = CipherMode.ECB;//***模式选择
des.Padding = PaddingMode.Zeros;//***补齐方式0
//des.IV = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0,8));
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}",b);
}
//ret.ToString();
return ret.ToString();
}
我想问 如果我密码大于8位 我可不可以 吧文件加密两遍(这样就可以使用16位了)解密的时候也解两遍
想请教楼主 及各位大虾 我这样做可不可以!!!