C#常用加密方式
                            
                            
                            一、AES加密算法AES算法基于排列和置換運(yùn)算。排列是對(duì)數(shù)據(jù)重新進(jìn)行安排,置換是將一個(gè)數(shù)據(jù)單元替換為另一個(gè)。AES 使用幾種不同的方法來(lái)執(zhí)行排列和置換運(yùn)算。 AES是一個(gè)迭代的、對(duì)稱(chēng)密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節(jié))分組加密和解密數(shù)據(jù)。與公共密鑰密碼使用密鑰對(duì)不同,對(duì)稱(chēng)密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過(guò)分組密碼返回的加密數(shù)據(jù)的位數(shù)與輸入數(shù)據(jù)相同。迭代加密使用一個(gè)循環(huán)結(jié)構(gòu),在該循環(huán)中重復(fù)置換和替換輸入數(shù)據(jù)。 摘自:互動(dòng)百科幾種模式的優(yōu)缺點(diǎn)對(duì)比: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設(shè)計(jì)中使用了分組密碼設(shè)計(jì)的兩個(gè)原則:混淆(confusion)和擴(kuò)散(diffusion),其目的是抗擊敵手對(duì)密碼系統(tǒng)的統(tǒng)計(jì)分析。混淆是使密文的統(tǒng)計(jì)特性與密鑰的取值之間的關(guān)系盡可能復(fù)雜化,以使密鑰和明文以及密文之間的依賴(lài)性對(duì)密碼分析者來(lái)說(shuō)是無(wú)法利用的。擴(kuò)散的作用就是將每一位明文的影響盡可能迅速地作用到較多的輸出密文位中,以便在大量的密文中消除明文的統(tǒng)計(jì)結(jié)構(gòu),并且使每一位密鑰的影響盡可能迅速地?cái)U(kuò)展到較多的密文位中,以防對(duì)密鑰進(jìn)行逐段破譯。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是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在已近二十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。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);// 保存到磁盤(pán)
                    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>表示加密數(shù)據(jù)的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>未加密數(shù)據(jù)的字符串</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,全稱(chēng)SecureHashAlgorithm,是一種數(shù)據(jù)加密算法,該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉(zhuǎn)換成一段(通常更小)密文,也可以簡(jiǎn)單的理解為取一串輸入碼(稱(chēng)為預(yù)映射或信息),并把它們轉(zhuǎn)化為長(zhǎng)度較短、位數(shù)固定的輸出序列即散列值(也稱(chēng)為信息摘要或信息認(rèn)證代碼)的過(guò)程。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[]數(shù)組  var Md5 = new MD5CryptoServiceProvider();var encryptbytes = Md5.ComputeHash(bytes);//求哈希值  return Base64To16(encryptbytes);//將Byte[]數(shù)組轉(zhuǎn)為凈荷明文(其實(shí)就是字符串)  
        }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;}}
}  
                        
                        
                        ?
轉(zhuǎn)載于:https://www.cnblogs.com/Denghejing/p/9560401.html
總結(jié)
 
                            
                        - 上一篇: Redis学习日记-05:SORT命令
- 下一篇: log4net使用指南(转载)
