解決疑問:爲什麼需要賦值?
des.Key = keyBytes;
des.IV = keyBytes;
DESCryptoServiceProvider 點擊查看介紹
加密解密輔助類:點擊查看
私鑰加密
定義:定義一個包裝對象來訪問加密服務提供程序 (CSP) 版本的數據加密標準 (DES) 算法。 此類不能被繼承。
研究這個類不如去研究它的父類,所以我們把重點轉移到 Des這個類
Des
定義:表示數據加密標準 (DES) 算法的基類,所有 DES 實現都必須從此基類派生。
你需要知道:
你只用設置Key(祕鑰)和 IV(向量)。
4.0以下
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
4.5或以上就會顯示此類已過時,所以我們得換一種寫法。
我們可以根據密碼來加密
public static string MD5(string str)
{
//微軟md5方法參考return FormsAuthentication.HashPasswordForStoringInConfigFile(str, "md5");
byte[] b = Encoding.Default.GetBytes(str);
b = new MD5CryptoServiceProvider().ComputeHash(b);
string ret = "";
for (int i = 0; i < b.Length; i++)
ret += b[i].ToString("x").PadLeft(2, '0'); //轉成16進制,如果小於2位用0補充
return ret;
}
我們配置好了Key和IV ,就可以使用這個了,你可以知道,加密和解密所配置的Key和IV必須爲一樣的。
加密/解碼都返回這個接口
準備工作完成了。最後一個類
CryptoStream 類
定義將數據流鏈接到加密轉換的流。
第一個參數 流,
第二個參數 接口
第三個參數 枚舉
完整的一套加密:
///// <summary>
///// 加密數據
///// </summary>
///// <param name="text">加密字符串</param>
///// <param name="skey">生成祕鑰,默認爲MATICSOFT</param>
///// <returns>返回加密字符串</returns>
public static string Encrypt(string Text, string sKey = "MATICSOFT")
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray;
inputByteArray = Encoding.Default.GetBytes(Text); //把文本轉成字節
des.Key = ASCIIEncoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.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);//十六進制字符串,後面的2爲精度.
}
return ret.ToString();
}
/// <summary>
/// 對祕鑰進行處理
/// </summary>
/// <param name="str">你的祕鑰</param>
/// <returns></returns>
public static string MD5(string str)
{
//微軟md5方法參考return FormsAuthentication.HashPasswordForStoringInConfigFile(str, "md5");
byte[] b = Encoding.Default.GetBytes(str);
b = new MD5CryptoServiceProvider().ComputeHash(b);
string ret = "";
for (int i = 0; i < b.Length; i++)
ret += b[i].ToString("x").PadLeft(2, '0'); //轉成16進制,如果小於2位用0補充
return ret;
}
/// <summary>
/// 解密數據
/// </summary>
/// <param name="Text">加密的字符串</param>
/// <param name="sKey">解密祕鑰</param>
/// <returns>解密後的字符串</returns>
public static string Decrypt(string Text, string sKey = "MATICSOFT")
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len;
len = Text.Length / 2;
byte[] inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}