1,單向加密:SHA1和MD5,只能加密而不能解密,常用語密碼的存儲。使用方法各有兩種。
public static string EncrtptMD5(string pData,string pEncode)
{
MD5CryptoServiceProvider sMD5 = new MD5CryptoServiceProvider();
try
{
byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
byte[] sRes = sMD5.ComputeHash(sData, 0, sData.Length);
return Convert.ToBase64String(sRes, 0, sRes.Length);
}
catch (Exception E)
{
MessageBox.Show(E.Message);
return "";
}
}
public static string EncryptSHA1(string pData, string pEncode)
{
SHA1CryptoServiceProvider sSHA1 = new SHA1CryptoServiceProvider();
try
{
byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
byte[] sRes = sSHA1.ComputeHash(sData, 0, sData.Length);
return Convert.ToBase64String(sRes);
}
catch (Exception E)
{
MessageBox.Show(E.Message);
return "";
}
}
public static string EncryptMD5(string pData)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(pData, "MD5");
}
public static string EncryptSHA1(string pData)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(pData,"SHA1");
}
2,雙向加密DES,由於不怎麼安全實際用的不是很多
public static string EncryptDES(string pData, string pKey, string pV, string pEncode)
{
if (pKey.Length > 8)
pKey = pKey.Substring(0, 8);
else if (pKey.Length < 8)
pKey = pKey + "abcdefgh".Substring(0,8-pKey.Length);
DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);
MemoryStream sMemStream = new MemoryStream();
CryptoStream sCrptStream = new CryptoStream(sMemStream, sDes.CreateEncryptor(sKey, sV), CryptoStreamMode.Write);
sCrptStream.Write(sData, 0, sData.Length);
sCrptStream.FlushFinalBlock();
return Convert.ToBase64String(sMemStream.ToArray());
}
public static string DecryptDES(string pData, string pKey, string pV, string pEncode)
{
if (pKey.Length > 8)
pKey = pKey.Substring(0, 8);
else if (pKey.Length < 8)
pKey = pKey + "abcdefgh".Substring(0, 8 - pKey.Length);
/* DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
byte[] sData = Convert.FromBase64String(pData);
byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);
MemoryStream sMemStream = new MemoryStream();
CryptoStream sCryStream = new CryptoStream(sMemStream, sDes.CreateDecryptor(sKey, sV), CryptoStreamMode.Write);
sCryStream.Write(sData, 0, sData.Length);
sCryStream.FlushFinalBlock();
return Encoding.UTF8.GetString(sMemStream.ToArray());//Convert.ToBase64String(sMemStream.ToArray());*/
DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
byte[] sData = Convert.FromBase64String(pData);
byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);
MemoryStream sMem = new MemoryStream(sData);
CryptoStream sCrypt = new CryptoStream(sMem, sDes.CreateDecryptor(sKey, sV), CryptoStreamMode.Read);
/*byte[] sRes = new byte[sData.Length];
sCrypt.Read(sRes, 0, sData.Length);
return Encoding.GetEncoding(pEncode).GetString(sRes);不怎麼好,因爲字節數組大小不好確定*/
StreamReader sReader = new StreamReader(sCrypt);//比較好,要注意,Reader流只能與Read模式配合
return sReader.ReadToEnd();
}
3,關於加密算法有兩點需要說明
(a)最好不要用Encoding類把加密的數據轉化爲字符串,因爲它會驗證和轉換Unicode不允許使用的無效值,這樣的話就可能使得將字符串轉換回字節數組時得到不同的結果。用Convert.ToBase64String是個不錯的選擇,所以上面的代碼需要一些微小的改動。
(b)DES的解密算法中既可以爲CryptoStream指定寫模式也可爲它指定讀模式。處於寫模式時MemStream的初始化不需要數據,通過Write方法將數據寫入Memstream中,最後將Memstream流轉換爲數組完成任務;處於讀模式時Memstream的初始化需要數據,通過Read方法將數據從Memstream中讀入指定的緩衝區中完成任務。