相信很多人在開發(fā)過程中經(jīng)常會遇到需要對一些重要的信息進行加密處理,,今天給大家分享我個人總結(jié)的一些加密算法:
常見的加密方式分為可逆和不可逆兩種方式
可逆:RSA,AES,DES等
不可逆:常見的MD5,,SHAD等
一、MD5消息摘要算法
我想這是大家都常聽過的算法,,可能也用的比較多,。那么什么是MD5算法呢?MD5全稱是message-digest algorithm 5,,簡單的說就是單向的加密,,也就是說無法根據(jù)密文推導出明文。
MD5主要用途:
1,、對一段信息生成信息摘要,,該摘要對該信息具有唯一性,可以作為數(shù)字簽名
2、用于驗證文件的有效性(是否有丟失或損壞的數(shù)據(jù))
3,、對用戶密碼的加密
4,、在哈希函數(shù)中計算散列值
從上邊的主要用途中我們看到,,由于算法的某些不可逆特征,在加密應用上有較好的安全性,。通過使用MD5加密算法,,我們輸入一個任意長度的字節(jié)串,都會生成一個128位的整數(shù),。所以根據(jù)這一點MD5被廣泛的用作密碼加密,。下面我就像大家演示一下怎樣進行密碼加密。
首先需要引入命名空間,,先看一個比較簡單的MD5加密的例子:
using System.Security;
using System.Security.Cryptography;
1 2 3 4 5 6 | public string ToMD5( string strs) {
MD5 md5 = new MD5CryptoServiceProvider();
byte [] bytes = Encoding.Default.GetBytes(strs); //將要加密的字符串轉(zhuǎn)換為字節(jié)數(shù)組
byte [] encryptdata = md5.ComputeHash(bytes); //將字符串加密后也轉(zhuǎn)換為字符數(shù)組
return Convert.ToBase64String(encryptdata); //將加密后的字節(jié)數(shù)組轉(zhuǎn)換為加密字符串
}
|
這里我們需要注意的是,,不論是在加密的過程中,,加密前要將加密字符串轉(zhuǎn)為字節(jié)數(shù)組,加密后也要生成密文的字節(jié)數(shù)據(jù),然后再轉(zhuǎn)化為密文,。
下面是關于MD5加密的其他形式,,可以根據(jù)需求編寫你們自己需要的加密算法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | /// <summary>
/// 創(chuàng)建哈希字符串適用于任何 MD5 哈希函數(shù) (在任何平臺) 上創(chuàng)建 32 個字符的十六進制格式哈希字符串
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static string Get32MD5One( string source)
{
using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())
{
byte [] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));
System.Text.StringBuilder sBuilder = new System.Text.StringBuilder();
for ( int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString( "x2" ));
}
string hash = sBuilder.ToString();
return hash.ToUpper();
}
}
/// <summary>
/// 獲取16位md5加密
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static string Get16MD5One( string source)
{
using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())
{
byte [] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));
//轉(zhuǎn)換成字符串,,并取9到25位
string sBuilder = BitConverter.ToString(data, 4, 8);
//BitConverter轉(zhuǎn)換出來的字符串會在每個字符中間產(chǎn)生一個分隔符,,需要去除掉
sBuilder = sBuilder.Replace( "-" , "" );
return sBuilder.ToString().ToUpper();
}
}
//// <summary>
/// </summary>
/// <param name="strSource">需要加密的明文</param>
/// <returns>返回32位加密結(jié)果,該結(jié)果取32位加密結(jié)果的第9位到25位</returns>
public static string Get32MD5Two( string source)
{
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
//獲取密文字節(jié)數(shù)組
byte [] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
//轉(zhuǎn)換成字符串,,32位
string strResult = BitConverter.ToString(bytResult);
//BitConverter轉(zhuǎn)換出來的字符串會在每個字符中間產(chǎn)生一個分隔符,,需要去除掉
strResult = strResult.Replace( "-" , "" );
return strResult.ToUpper();
}
//// <summary>
/// </summary>
/// <param name="strSource">需要加密的明文</param>
/// <returns>返回16位加密結(jié)果,該結(jié)果取32位加密結(jié)果的第9位到25位</returns>
public static string Get16MD5Two( string source)
{
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
//獲取密文字節(jié)數(shù)組
byte [] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
//轉(zhuǎn)換成字符串,,并取9到25位
string strResult = BitConverter.ToString(bytResult, 4, 8);
//BitConverter轉(zhuǎn)換出來的字符串會在每個字符中間產(chǎn)生一個分隔符,,需要去除掉
strResult = strResult.Replace( "-" , "" );
return strResult.ToUpper();
}
|
二、DES加密
DES加密算法為密碼體制中的對稱密碼體制,,又被稱為美國數(shù)據(jù)加密標準,,是1972年美國IBM公司研制的對稱密碼體制加密算法。 明文按64位進行分組,,密鑰長64位,,密鑰事實上是56位參與DES運算(第8、16,、24,、32、40,、48,、56、64位是校驗位,, 使得每個密鑰都有奇數(shù)個1)分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法,。
DES,全稱Data Encryption Standard,,是一種對稱加密算法,。由于其安全性比較高(有限時間內(nèi),沒有一種加密方法可以說是100%安全),很可能是最廣泛的密鑰系統(tǒng)(我們公司也在用,估計你們也有在用....),,唯一一種方法可以破解該算法,,那就是窮舉法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | /// <summary>
/// DES加密
/// </summary>
/// <param name="data">加密數(shù)據(jù)</param>
/// <param name="key">8位字符的密鑰字符串</param>
/// <param name="iv">8位字符的初始化向量字符串</param>
/// <returns></returns>
public static string DESEncrypt( string data, string key, string iv)
{
byte [] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
byte [] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
int i = cryptoProvider.KeySize;
MemoryStream ms = new MemoryStream();
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cst);
sw.Write(data);
sw.Flush();
cst.FlushFinalBlock();
sw.Flush();
return Convert.ToBase64String(ms.GetBuffer(), 0, ( int )ms.Length);
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="data">解密數(shù)據(jù)</param>
/// <param name="key">8位字符的密鑰字符串(需要和加密時相同)</param>
/// <param name="iv">8位字符的初始化向量字符串(需要和加密時相同)</param>
/// <returns></returns>
public static string DESDecrypt( string data, string key, string iv)
{
byte [] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
byte [] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);
byte [] byEnc;
try
{
byEnc = Convert.FromBase64String(data);
}
catch
{
return null ;
}
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream(byEnc);
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cst);
return sr.ReadToEnd();
}
|
此外還有AES加密算法,,但是AES加密是一個新的可以用于保護電子數(shù)據(jù)的加密算法,。其產(chǎn)生的密碼是迭代對稱的分組密碼,代加密使用一個循環(huán)結(jié)構(gòu),,在該循環(huán)中重復置換和替換輸入數(shù)據(jù),。
三、RSA加密算法
在談RSA加密算法之前,,我們需要先了解下兩個專業(yè)名詞,,對稱加密和非對稱加密。
對稱加密即:含有一個稱為密鑰的東西,,在消息發(fā)送前使用密鑰對消息進行加密,,在對方收到消息之后,使用相同的密鑰進行解密
非對稱加密即:加密和解密使用不同的密鑰的一類加密算法,。這類加密算法通常有兩個密鑰A和B,,使用密鑰A加密數(shù)據(jù)得到的密文,只有密鑰B可以進行解密操作(即使密鑰A也無法解密),,相反,,使用了密鑰B加密數(shù)據(jù)得到的密文,只有密鑰A可以解密,。這兩個密鑰分別稱為私鑰和公鑰,,顧名思義,私鑰就是你個人保留,,不能公開的密鑰,,而公鑰則是公開給加解密操作的另一方的。根據(jù)不同用途,,對數(shù)據(jù)進行加密所使用的密鑰也不相同(有時用公鑰加密,,私鑰解密;有時相反用私鑰加密,,公鑰解密),。非對稱加密的代表算法是RSA算法。
了解了這兩個名詞下面來講,,RSA加密算法,。RSA取名來自開發(fā)他們?nèi)叩拿帧SA是目前最有影響力的公鑰加密算法,,多用于數(shù)據(jù)加密和數(shù)字簽名,。雖然有這么大的影響力,,但是同時它也有一些弊端,它產(chǎn)生密鑰很麻煩,,受到素數(shù)產(chǎn)生技術(shù)的限制,,因而難以做到一次一密,分組長度太大等,。
下面通過示例演示使用RSA加密,、解密,引用名稱空間System.Security.Cryptography;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | /// <summary>
/// RSA加密數(shù)據(jù)
/// </summary>
/// <param name="express">要加密數(shù)據(jù)</param>
/// <param name="KeyContainerName">密匙容器的名稱</param>
/// <returns></returns>
public static string RSAEncryption( string express, string KeyContainerName = null )
{
System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters();
param.KeyContainerName = KeyContainerName ?? "zhiqiang" ; //密匙容器的名稱,,保持加密解密一致才能解密成功
using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param))
{
byte [] plaindata = System.Text.Encoding.Default.GetBytes(express); //將要加密的字符串轉(zhuǎn)換為字節(jié)數(shù)組
byte [] encryptdata = rsa.Encrypt(plaindata, false ); //將加密后的字節(jié)數(shù)據(jù)轉(zhuǎn)換為新的加密字節(jié)數(shù)組
return Convert.ToBase64String(encryptdata); //將加密后的字節(jié)數(shù)組轉(zhuǎn)換為字符串
}
}
/// <summary>
/// RSA解密數(shù)據(jù)
/// </summary>
/// <param name="express">要解密數(shù)據(jù)</param>
/// <param name="KeyContainerName">密匙容器的名稱</param>
/// <returns></returns>
public static string RSADecrypt( string ciphertext, string KeyContainerName = null )
{
System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters();
param.KeyContainerName = KeyContainerName ?? "zhiqiang" ; //密匙容器的名稱,,保持加密解密一致才能解密成功
using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param))
{
byte [] encryptdata = Convert.FromBase64String(ciphertext);
byte [] decryptdata = rsa.Decrypt(encryptdata, false );
return System.Text.Encoding.Default.GetString(decryptdata);
}
}
|
四、Base64編碼
這個就不做過多解釋了,,直接上代碼,。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #region Base64加密解密
/// <summary>
/// Base64加密
/// </summary>
/// <param name="input">需要加密的字符串</param>
/// <returns></returns>
public static string Base64Encrypt( string input)
{
return Base64Encrypt(input, new UTF8Encoding());
}
/// <summary>
/// Base64加密
/// </summary>
/// <param name="input">需要加密的字符串</param>
/// <param name="encode">字符編碼</param>
/// <returns></returns>
public static string Base64Encrypt( string input, Encoding encode)
{
return Convert.ToBase64String(encode.GetBytes(input));
}
/// <summary>
/// Base64解密
/// </summary>
/// <param name="input">需要解密的字符串</param>
/// <returns></returns>
public static string Base64Decrypt( string input)
{
return Base64Decrypt(input, new UTF8Encoding());
}
/// <summary>
/// Base64解密
/// </summary>
/// <param name="input">需要解密的字符串</param>
/// <param name="encode">字符的編碼</param>
/// <returns></returns>
public static string Base64Decrypt( string input, Encoding encode)
{
return encode.GetString(Convert.FromBase64String(input));
}
#endregion
|
五、SHA安全散列算法
SHA,,全稱SecureHashAlgorithm,,是一種數(shù)據(jù)加密算法,該算法的思想是接收一段明文,,然后以一種不可逆的方式將它轉(zhuǎn)換成一段(通常更?。┟芪模部梢院唵蔚睦斫鉃槿∫淮斎氪a(稱為預映射或信息),,并把它們轉(zhuǎn)化為長度較短,、位數(shù)固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。
下面貼SHA各種加密算法代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //SHA為不可逆加密方式
public static string SHA1Encrypt( string Txt)
{
var bytes = System.Text.Encoding.Default.GetBytes(Txt);
var SHA = new System.Security.Cryptography.SHA1CryptoServiceProvider();
var encryptbytes = SHA.ComputeHash(bytes);
return Convert.ToBase64String(encryptbytes);
}
public static string SHA256Encrypt( string Txt)
{
var bytes = System.Text.Encoding.Default.GetBytes(Txt);
var SHA256 = new System.Security.Cryptography.SHA256CryptoServiceProvider();
var encryptbytes = SHA256.ComputeHash(bytes);
return Convert.ToBase64String(encryptbytes);
}
public static string SHA384Encrypt( string Txt)
{
var bytes = System.Text.Encoding.Default.GetBytes(Txt);
var SHA384 = new System.Security.Cryptography.SHA384CryptoServiceProvider();
var encryptbytes = SHA384.ComputeHash(bytes);
return Convert.ToBase64String(encryptbytes);
}
public string SHA512Encrypt( string Txt)
{
var bytes = System.Text.Encoding.Default.GetBytes(Txt);
var SHA512 = new System.Security.Cryptography.SHA512CryptoServiceProvider();
var encryptbytes = SHA512.ComputeHash(bytes);
return Convert.ToBase64String(encryptbytes);
}
|
六,、AES加密算法
AES算法基于排列和置換運算,。排列是對數(shù)據(jù)重新進行安排,置換是將一個數(shù)據(jù)單元替換為另一個,。
AES 使用幾種不同的方法來執(zhí)行排列和置換運算,。 AES是一個迭代的、對稱密鑰分組的密碼,,它可以使用128,、192 和 256 位密鑰,并且用 128 位(16字節(jié))分組加密和解密數(shù)據(jù),。與公共密鑰密碼使用密鑰對不同,,對稱密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過分組密碼返回的加密數(shù)據(jù)的位數(shù)與輸入數(shù)據(jù)相同,。迭代加密使用一個循環(huán)結(jié)構(gòu),,在該循環(huán)中重復置換和替換輸入數(shù)據(jù)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | /// <summary>
/// AES 加密
/// </summary>
/// <param name="str">明文(待加密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public string AesEncrypt( string str, string key)
{
if ( string .IsNullOrEmpty(str)) return null ;
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray);
}
/// <summary>
/// AES 解密
/// </summary>
/// <param name="str">明文(待解密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public string AesDecrypt( string str, string key)
{
if ( string .IsNullOrEmpty(str)) return null ;
Byte[] toEncryptArray = Convert.FromBase64String(str);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
|
|