转自http://blog.csdn.net/hnas_better/archive/2007/11/22/1897864.aspx
项目开发过程中,经常会遇到需要加密的需求,在这里简单为大家介绍一下MD5加密原理及DES算法,并用C# 实现。由于没有仔细研究过,函数写的比较粗糙,有兴趣的可以改进一下哦!
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。请注意我使用了“字节串”而不是“字符串”这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
MD5还广泛用于加密和解密技术上,在很多网站系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较。这样即使黑客得到数据库也不知道登录密码,确保了网站的安全。
以下文字内容引自http://zhidao.baidu.com/question/5017928.html
最著名的保密密钥或对称密钥加密算法DES(Data Encryption Standard)是由IBM公司在70年代发展起来的,并经过政府的加密标准筛选后,于1976年11月被美国政府采用,DES随后被美国国家标准局和美国国家标准协会(American National Standard Institute, ANSI) 承认。
DES使用56位密钥对64位的数据块进行加密,并对64位的数据块进行16轮编码。与每轮编码时,一个48位的“每轮”密钥值由56位的完整密钥得出来。DES用软件进行解码需要用很长时间,而用硬件解码速度非常快,但幸运的是当时大多数黑客并没有足够的设备制造出这种硬件设备。在1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。所以,当时DES被认为是一种十分强壮的加密方法。
但是,当今的计算机速度越来越快了,制造一台这样特殊的机器的花费已经降到了十万美元左右,所以用它来保护十亿美元的银行间线缆时,就会仔细考虑了。另一个方面,如果只用它来保护一台服务器,那么DES确实是一种好的办法,因为黑客绝不会仅仅为入侵一个服务器而花那么多的钱破解DES密文。由于现在已经能用二十万美圆制造一台破译DES的特殊的计算机,所以现在再对要求“强壮”加密的场合已经不再适用了。
三重DES
因为确定一种新的加密法是否真的安全是极为困难的,而且DES的唯一密码学缺点,就是密钥长度相对比较短,所以人们并没有放弃使用DES,而是想出了一个解决其长度问题的方法,即采用三重DES。这种方法用两个密钥对明文进行三次加密,假设两个密钥是K1和K2,其算法的步骤如图5.9所示:
1. 用密钥K1进行DEA加密。
2. 用K2对步骤1的结果进行DES解密。
3. 用步骤2的结果使用密钥K1进行DES加密。
这种方法的缺点,是要花费原来三倍时间,从另一方面来看,三重DES的112位密钥长度是很“强壮”的加密方式了
以下为DES的两个简单的加密、解密函数
using System.Text;
using System.Security.Cryptography;
public string Encrypt( string pToEncrypt, string sKey)
... {
//8位密钥,16位加密结果
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
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();
}
/**/ ///解密
public string Decrypt( string pToDecrypt, string sKey)
... {
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for(int x = 0;
x < pToDecrypt.Length / 2; x++)
...{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}