c#的哈希(hash)算法解析

来源:互联网 发布:人脸变漫画软件 编辑:程序博客网 时间:2024/05/17 20:31

1.方法一:

[c-sharp] view plaincopyprint?
  1. //适用于C#语言    
  2. //使用前需导入以下命名空间:using System.Web.Security;   
  3. //第一个参数为需加密的字符串,第二个参数为加密的格式(只有SHA1和MD5两种,可任选一种)  
  4. public string EncryptPassword(string PasswordString, string PasswordFormat)  
  5.     {  
  6.         string EncryptPassword = null;  
  7.         if ("SHA1".Equals(PasswordFormat))  
  8.         {  
  9.             EncryptPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(PasswordString, "SHA1");  
  10.         }  
  11.         else if ("MD5".Equals(PasswordFormat))  
  12.         {  
  13.             EncryptPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(PasswordString, "MD5");  
  14.         }  
  15.         else  
  16.         {  
  17.             EncryptPassword = PasswordString;  
  18.         }  
  19.         return EncryptPassword;  
  20.     }  
  21.   
  22.   
  23. //======================加密解密方法=====================  
  24.   
  25. using System;  
  26. using System.Security.Cryptography;  
  27. using System.IO;  
  28. using System.Text;/**//// <summary>  
  29.         /// DEC 加密过程   
  30.         /// </summary>   
  31.         /// <param name="pToEncrypt">被加密的字符串</param>  
  32.         /// <param name="sKey">密钥(只支持8个字节的密钥)</param>  
  33.         /// <returns>加密后的字符串</returns>  
  34.         public string Encrypt(string pToEncrypt, string sKey)  
  35.         ...{  
  36.             //访问数据加密标准(DES)算法的加密服务提供程序 (CSP) 版本的包装对象  
  37.             DESCryptoServiceProvider des = new DESCryptoServiceProvider();   
  38.             des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量  
  39.             des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  //原文使用ASCIIEncoding.ASCII方法的GetBytes方法  
  40.   
  41.             byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);//把字符串放到byte数组中  
  42.   
  43.             MemoryStream ms = new MemoryStream();//创建其支持存储区为内存的流   
  44.             //定义将数据流链接到加密转换的流   
  45.             CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);  
  46.             cs.Write(inputByteArray, 0, inputByteArray.Length);  
  47.             cs.FlushFinalBlock();  
  48.             //上面已经完成了把加密后的结果放到内存中去   
  49.   
  50.             StringBuilder ret = new StringBuilder();  
  51.             foreach (byte b in ms.ToArray())  
  52.             ...{  
  53.                 ret.AppendFormat("{0:X2}", b);  
  54.             }  
  55.             ret.ToString();  
  56.             return ret.ToString();  
  57.         }  
  58.   
  59.        /**//**//**//// <summary>  
  60.         /// DEC 解密过程   
  61.        /// </summary>   
  62.         /// <param name="pToDecrypt">被解密的字符串</param>  
  63.         /// <param name="sKey">密钥(只支持8个字节的密钥,同前面的加密密钥相同)</param>  
  64.        /// <returns>返回被解密的字符串</returns>   
  65.         public string Decrypt(string pToDecrypt, string sKey)  
  66.         ...{  
  67.             DESCryptoServiceProvider des = new DESCryptoServiceProvider();  
  68.   
  69.             byte[] inputByteArray = new byte[pToDecrypt.Length / 2];  
  70.             for (int x = 0; x < pToDecrypt.Length / 2; x++)  
  71.             ...{  
  72.                 int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));  
  73.                 inputByteArray[x] = (byte)i;  
  74.             }  
  75.   
  76.             des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量,此值重要,不能修改  
  77.             des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  
  78.             MemoryStream ms = new MemoryStream();  
  79.             CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);  
  80.   
  81.             cs.Write(inputByteArray, 0, inputByteArray.Length);  
  82.             cs.FlushFinalBlock();  
  83.   
  84.             //建立StringBuild对象,createDecrypt使用的是流对象,必须把解密后的文本变成流对象  
  85.             StringBuilder ret = new StringBuilder();   
  86.   
  87.             return System.Text.Encoding.Default.GetString(ms.ToArray());  
  88.         }  


具体在程序中使用加密解密算法的例子如下:
在发送页面
Response.Redirect("~/GridView.aspx?ID=" + Encrypt("zlh","abcdefgh"));

 

在接受页面
string acceptStr;
acceptStr = Decrypt(Request.QueryString["ID"],"abcdefgh");

转贴来源:http://hi.baidu.com/4092887/blog/item/4dfd89efaf805ee5cf1b3e5a.html

 

2.方法二:(简单)

  FormsAuthentication.HashPasswordForStoringInConfigFile(string, "SHA1");

 或

 FormsAuthentication.HashPasswordForStoringInConfigFile(String, "MD5");

原创粉丝点击