MD5、DES加密算法简介及DES算法C#实现

来源:互联网 发布:如何使用mysql 编辑:程序博客网 时间:2024/06/05 10:00

 项目开发过程中,经常会遇到需要加密的需求,在这里简单为大家介绍一下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.IO;
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());    
  }

 


 
By  deer_box