一、AES加密算法
AES算法基於排列和置換運算。排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。AES 使用幾種不同的方法來執行排列和置換運算。
AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,並且用 128 位(16字節)分組加密和解密數據。與公共密鑰密碼使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數據。通過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。 摘自:互動百科
幾種模式的優缺點對比:
C#代碼:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; namespace PwdDemo { public class AESHelper { /// <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); } } }
二、DES加密算法
DES設計中使用了分組密碼設計的兩個原則:混淆(confusion)和擴散(diffusion),其目的是抗擊敵手對密碼系統的統計分析。混淆是使密文的統計特性與密鑰的取值之間的關系盡可能復雜化,以使密鑰和明文以及密文之間的依賴性對密碼分析者來說是無法利用的。擴散的作用就是將每一位明文的影響盡可能迅速地作用到較多的輸出密文位中,以便在大量的密文中消除明文的統計結構,並且使每一位密鑰的影響盡可能迅速地擴展到較多的密文位中,以防對密鑰進行逐段破譯。
C#代碼:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; namespace PwdDemo { public class DESHelper { //密鑰 public static byte[] _KEY = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; //向量 public static byte[] _IV = new byte[] { 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 }; /// <summary> /// DES加密操作 /// </summary> /// <param name="normalTxt"></param> /// <returns></returns> public string DesEncrypt(string normalTxt) { //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(_KEY, _IV), CryptoStreamMode.Write); StreamWriter sw = new StreamWriter(cst); sw.Write(normalTxt); sw.Flush(); cst.FlushFinalBlock(); sw.Flush(); string strRet = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); return strRet; } /// <summary> /// DES解密操作 /// </summary> /// <param name="securityTxt">加密字符串</param> /// <returns></returns> public string DesDecrypt(string securityTxt)//解密 { //byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(_KEY); //byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(_IV); byte[] byEnc; try { securityTxt.Replace("_%_", "/"); securityTxt.Replace("-%-", "#"); byEnc = Convert.FromBase64String(securityTxt); } catch { return null; } DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); MemoryStream ms = new MemoryStream(byEnc); CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(_KEY, _IV), CryptoStreamMode.Read); StreamReader sr = new StreamReader(cst); return sr.ReadToEnd(); } } }
三、RSA加密算法
RSA是第一個能同時用於加密和數字簽名的算法,也易於理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。
C#代碼:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; namespace PwdDemo { public class RSAHelper { private const int RsaKeySize = 2048; private const string publicKeyFileName = "RSA.Pub"; private const string privateKeyFileName = "RSA.Private"; /// <summary> ///在給定路徑中生成XML格式的私鑰和公鑰。 /// </summary> public void GenerateKeys(string path) { using (var rsa = new RSACryptoServiceProvider(RsaKeySize)) { try { // 獲取私鑰和公鑰。 var publicKey = rsa.ToXmlString(false); var privateKey = rsa.ToXmlString(true); // 保存到磁盤 File.WriteAllText(Path.Combine(path, publicKeyFileName), publicKey); File.WriteAllText(Path.Combine(path, privateKeyFileName), privateKey); //Console.WriteLine(string.Format("生成的RSA密鑰的路徑: {0}\\ [{1}, {2}]", path, publicKeyFileName, privateKeyFileName)); } finally { rsa.PersistKeyInCsp = false; } } } /// <summary> /// 用給定路徑的RSA公鑰文件加密純文本。 /// </summary> /// <param name="plainText">要加密的文本</param> /// <param name="pathToPublicKey">用於加密的公鑰路徑.</param> /// <returns>表示加密數據的64位編碼字符串.</returns> public string Encrypt(string plainText, string pathToPublicKey) { using (var rsa = new RSACryptoServiceProvider(RsaKeySize)) { try { //加載公鑰 var publicXmlKey = File.ReadAllText(pathToPublicKey); rsa.FromXmlString(publicXmlKey); var bytesToEncrypt = System.Text.Encoding.Unicode.GetBytes(plainText); var bytesEncrypted = rsa.Encrypt(bytesToEncrypt, false); return Convert.ToBase64String(bytesEncrypted); } finally { rsa.PersistKeyInCsp = false; } } } /// <summary> /// Decrypts encrypted text given a RSA private key file path.給定路徑的RSA私鑰文件解密 加密文本 /// </summary> /// <param name="encryptedText">加密的密文</param> /// <param name="pathToPrivateKey">用於加密的私鑰路徑.</param> /// <returns>未加密數據的字符串</returns> public string Decrypt(string encryptedText, string pathToPrivateKey) { using (var rsa = new RSACryptoServiceProvider(RsaKeySize)) { try { var privateXmlKey = File.ReadAllText(pathToPrivateKey); rsa.FromXmlString(privateXmlKey); var bytesEncrypted = Convert.FromBase64String(encryptedText); var bytesPlainText = rsa.Decrypt(bytesEncrypted, false); return System.Text.Encoding.Unicode.GetString(bytesPlainText); } finally { rsa.PersistKeyInCsp = false; } } } } }
四、SHA加密算法
SHA,全稱SecureHashAlgorithm,是一種數據加密算法,該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),並把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。
C#代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; namespace PwdDemo { public class SHAHelper { public string SHAmd5Encrypt(string normalTxt) { var bytes = Encoding.Default.GetBytes(normalTxt);//求Byte[]數組 var Md5 = new MD5CryptoServiceProvider(); var encryptbytes = Md5.ComputeHash(bytes);//求哈希值 return Base64To16(encryptbytes);//將Byte[]數組轉為凈荷明文(其實就是字符串) } public string SHA1Encrypt(string normalTxt) { var bytes = Encoding.Default.GetBytes(normalTxt); var SHA = new SHA1CryptoServiceProvider(); var encryptbytes = SHA.ComputeHash(bytes); return Base64To16(encryptbytes); } public string SHA256Encrypt(string normalTxt) { var bytes = Encoding.Default.GetBytes(normalTxt); var SHA256 = new SHA256CryptoServiceProvider(); var encryptbytes = SHA256.ComputeHash(bytes); return Base64To16(encryptbytes); } public string SHA384Encrypt(string normalTxt) { var bytes = Encoding.Default.GetBytes(normalTxt); var SHA384 = new SHA384CryptoServiceProvider(); var encryptbytes = SHA384.ComputeHash(bytes); return Base64To16(encryptbytes); } public string SHA512Encrypt(string normalTxt) { var bytes = Encoding.Default.GetBytes(normalTxt); var SHA512 = new SHA512CryptoServiceProvider(); var encryptbytes = SHA512.ComputeHash(bytes); return Base64To16(encryptbytes); } private string Base64To16(byte[] buffer) { string md_str = string.Empty; for (int i = 0; i < buffer.Length; i++) { md_str += buffer[i].ToString("x2"); } return md_str; } } }
以上內容大部分摘自網絡,代碼根據網上的改的,簡單測試過。