1、對稱加密算法(AES、DES、3DES)
對稱加密算法是指加密和解密采用相同的密鑰,是可逆的(即可解密)。
AES加密算法是密碼學中的高級加密標準,采用的是對稱分組密碼體制,密鑰長度的最少支持為128。AES加密算法是美國聯邦政府采用的區塊加密標準,這個標準用來替代原先的DES,已經被多方分析且廣為全世界使用。
AES數學原理詳解:https://www.cnblogs.com/block2016/p/5596676.html
優點:加密速度快
缺點:密鑰的傳遞和保存是一個問題,參與加密和解密的雙方使用的密鑰是一樣的,這樣密鑰就很容易泄露。
2、非對稱加密算法(RSA、DSA、ECC)
非對稱加密算法是指加密和解密采用不同的密鑰(公鑰和私鑰),因此非對稱加密也叫公鑰加密,是可逆的(即可解密)。公鑰密碼體制根據其所依據的難題一般分為三類:大素數分解問題類、離散對數問題類、橢圓曲線類。
RSA加密算法是基于一個十分簡單的數論事實:將兩個大素數相乘十分容易,但是想要對其乘積進行因式分解極其困難,因此可以將乘積公開作為加密密鑰。雖然RSA的安全性一直未能得到理論上的證明,但它經歷了各種攻擊至今未被完全攻破。?
優點:加密和解密的密鑰不一致,公鑰是可以公開的,只需保證私鑰不被泄露即可,這樣就密鑰的傳遞變的簡單很多,從而降低了被破解的幾率。
缺點:加密速度慢
RSA加密算法既可以用來做數據加密,也可以用來數字簽名。
--數據加密過程:發送者用公鑰加密,接收者用私鑰解密(只有擁有私鑰的接收者才能解讀加密的內容)
--數字簽名過程:甲方用私鑰加密,乙方用公鑰解密(乙方解密成功說明就是甲方加的密,甲方就不可以抵賴)
詳細數學原理見?【來龍去脈系列】RSA算法原理
ECC加密算法是基于橢圓曲線上離散對數計算問題(ECDLP)的ECC算法。ECC算法的數學理論非常深奧和復雜,在工程應用中比較難于實現,但它的單位安全強度相對較高。
用國際上公認的對于ECC算法最有效的攻擊方法--Pollard rho方法去破譯和攻擊ECC算法,它的破譯或求解難度基本上是指數級的。正是由于RSA算法和ECC算法這一明顯不同,使得ECC算法的單位安全強度高于RSA算法,也就是說,要達到同樣的安全強度,ECC算法所需的密鑰長度遠比RSA算法低。有研究表示160位的橢圓密鑰與1024位的RSA密鑰安全性相同。在私鑰的加密解密速度上,ECC算法比RSA、DSA速度更快。存儲空間占用更小。
擴展閱讀:
ECDH and ECDSA? ?
How to encrypt data using Elliptic Curve Algorithm in C#
ECC Examples for C#
3、線性散列算法算法(MD5、SHA1、HMAC)
MD5全稱是Message-Digest Algorithm 5(信息摘要算法5),單向的算法不可逆(被MD5加密的數據不能被解密)。MD5加密后的數據長度要比加密數據小的多,且長度固定,且加密后的串是唯一的。
適用場景:常用在不可還原的密碼存儲、信息完整性校驗等。
信息完整性校驗:典型的應用是對一段信息產生信息摘要,以防止被篡改。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的“抵賴”,這就是所謂的數字簽名應用。
SHA-1 與 MD5 的比較
SHA-1摘要比MD5摘要長32 位,所以SHA-1對強行攻擊有更大的強度,比MD5更安全。使用強行技術,產生任何一個報文使其摘要等于給定報摘要的難度對MD5是2^128數量級的操作,而對SHA-1則是2^160數量級的操作。
在相同的硬件上,SHA-1 的運行速度比 MD5 慢。
4、混合加密
由于以上加密算法都有各自的缺點(RSA加密速度慢、AES密鑰存儲問題、MD5加密不可逆),因此實際應用時常將幾種加密算法混合使用。
例如:RSA+AES:
采用RSA加密AES的密鑰,采用AES對數據進行加密,這樣集成了兩種加密算法的優點,既保證了數據加密的速度,又實現了安全方便的密鑰管理。
那么,采用多少位的密鑰合適呢?一般來講密鑰長度越長,安全性越高,但是加密速度越慢。所以密鑰長度也要合理的選擇,一般RSA建議采用1024位的數字,AES建議采用128位即可。
5、Base64
嚴格意義講,Base64并不能算是一種加密算法,而是一種編碼格式,是網絡上最常見的用于傳輸8bid字節代碼的編碼方式之一。
Base64編碼可用于在HTTP環境下傳遞較長的標識信息,Base編碼不僅不僅比較簡單,同時也據有不可讀性(編碼的數據不會被肉眼直接看到)。
?
C#實現:
using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace EnDeCode1
{
/// <summary>
/// 加密解密工具類
/// 作者博客:https://www.cnblogs.com/tuyile006/
/// </summary>
public class EncodeHelper
{
#region MD5
/// <summary>
/// MD5哈希加密
/// </summary>
/// <param name=“scr”>原始string數據</param>
/// <returns>加密后的數據</returns>
public static string MD5(string scr)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] palindata = Encoding.Default.GetBytes(scr);//將要加密的字符串轉換為字節數組
byte[] encryptdata = md5.ComputeHash(palindata);//將字符串加密后也轉換為字符數組
return Convert.ToBase64String(encryptdata);//將加密后的字節數組轉換為加密字符串
}
#endregion
<span style="color: rgba(0, 0, 255, 1)">#region</span> SHA1<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> SHA1哈希加密</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="scr"></span><span style="color: rgba(0, 128, 0, 1)">原始string數據</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></span><span style="color: rgba(0, 128, 0, 1)">加密后的數據</span><span style="color: rgba(128, 128, 128, 1)"></returns></span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> SHA1(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> scr){SHA1 sha1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> SHA1CryptoServiceProvider();</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] palindata = Encoding.Default.GetBytes(scr);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">將要加密的字符串轉換為字節數組</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] encryptdata = sha1.ComputeHash(palindata);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">將字符串加密后也轉換為字符數組</span><span style="color: rgba(0, 0, 255, 1)">return</span> Convert.ToBase64String(encryptdata);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">將加密后的字節數組轉換為加密字符串</span>
}
#endregion
<span style="color: rgba(0, 0, 255, 1)">#region</span> RSA<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> RSA加密</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="scr"></span><span style="color: rgba(0, 128, 0, 1)">原始string數據</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> RSA(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> scr){CspParameters csp </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> CspParameters(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">密鑰容器知識參見https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">docs.microsoft.com/zh-cn/dotnet/standard/security/how-to-store-asymmetric-keys-in-a-key-container</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在Web中配置參見https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">docs.microsoft.com/zh-cn/previous-versions/aspnet/yxw286t2%28v%3dvs.100%29</span>csp.KeyContainerName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tuyile006.cnblogs.com</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">密匙容器的名稱,保持加密解密一致才能解密成功</span><span style="color: rgba(0, 0, 255, 1)">using</span> (RSACryptoServiceProvider rsa = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RSACryptoServiceProvider(csp)){</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] plaindata = Encoding.Default.GetBytes(scr);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">將要加密的字符串轉換為字節數組</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] encryptdata = rsa.Encrypt(plaindata, <span style="color: rgba(0, 0, 255, 1)">false</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">將加密后的字節數據轉換為新的加密字節數組</span><span style="color: rgba(0, 0, 255, 1)">return</span> Convert.ToBase64String(encryptdata);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">將加密后的字節數組轉換為字符串</span>
}
}
/// <summary>
/// RSA解密
/// </summary>
/// <param name=“scr”>密文</param>
/// <returns></returns>
public static string RSADecrypt(string scr)
{
try
{
CspParameters csp = new CspParameters();
csp.KeyContainerName = “tuyile006.cnblogs.com”;//密匙容器的名稱,保持加密解密一致才能解密成功
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp))
{
byte[] bytes = Convert.FromBase64String(scr); //加密時用了Base64,則解密時對應的也要用Base64解碼
byte[] DecryptBytes = rsa.Decrypt(bytes, false);
return Encoding.Default.GetString(DecryptBytes);
}
}
catch (Exception)
{
return string.Empty;
}
}
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 返回RSA公匙</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> GetRSAPublicKey(){CspParameters csp </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CspParameters();csp.KeyContainerName </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tuyile006.cnblogs.com</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">密匙容器的名稱,保持加密解密一致才能解密成功</span><span style="color: rgba(0, 0, 255, 1)">using</span> (RSACryptoServiceProvider rsa = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RSACryptoServiceProvider(csp)){</span><span style="color: rgba(0, 0, 255, 1)">return</span> rsa.ToXmlString(<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);}}</span><span style="color: rgba(0, 0, 255, 1)">#endregion</span><span style="color: rgba(0, 0, 255, 1)">#region</span> DES<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">string</span> DesIV_64 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">xiaoy><@</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定義默認加密密鑰 8個字節 </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 按指定鍵值進行DES加密</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="strContent"></span><span style="color: rgba(0, 128, 0, 1)">要加密字符</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="strKey"></span><span style="color: rgba(0, 128, 0, 1)">自定義鍵值 ASCII編碼 必須大于或等于8個字符</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> DES(<span style="color: rgba(0, 0, 255, 1)">string</span> strContent, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> strKey){</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span>.IsNullOrEmpty(strContent)) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;</span><span style="color: rgba(0, 0, 255, 1)">if</span> (strKey.Length > <span style="color: rgba(128, 0, 128, 1)">8</span>) strKey = strKey.Substring(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);DESCryptoServiceProvider cryptoProvider </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DESCryptoServiceProvider();</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] byKey =<span style="color: rgba(0, 0, 0, 1)"> Encoding.ASCII.GetBytes(strKey);</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] byIV =<span style="color: rgba(0, 0, 0, 1)"> Encoding.ASCII.GetBytes(DesIV_64);</span><span style="color: rgba(0, 0, 255, 1)">using</span> (MemoryStream ms = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MemoryStream()){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (CryptoStream cst = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write)){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (StreamWriter sw = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StreamWriter(cst)){sw.Write(strContent);sw.Flush();cst.FlushFinalBlock();sw.Flush();</span><span style="color: rgba(0, 0, 255, 1)">return</span> Convert.ToBase64String(ms.GetBuffer(), <span style="color: rgba(128, 0, 128, 1)">0</span>, (<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">)ms.Length);}}}}</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 按指定鍵值進行DES解密</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="strContent"></span><span style="color: rgba(0, 128, 0, 1)">要解密字符</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="strKey"></span><span style="color: rgba(0, 128, 0, 1)">加密時使用的鍵值 ASCII編碼 必須大于或等于8個字符</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> DESDecrypt(<span style="color: rgba(0, 0, 255, 1)">string</span> strContent, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> strKey){</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span>.IsNullOrEmpty(strContent)) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;</span><span style="color: rgba(0, 0, 255, 1)">if</span> (strKey.Length > <span style="color: rgba(128, 0, 128, 1)">8</span>) strKey = strKey.Substring(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] byKey =<span style="color: rgba(0, 0, 0, 1)"> Encoding.ASCII.GetBytes(strKey);</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] byIV =<span style="color: rgba(0, 0, 0, 1)"> Encoding.ASCII.GetBytes(DesIV_64);</span><span style="color: rgba(0, 0, 255, 1)">byte</span><span style="color: rgba(0, 0, 0, 1)">[] byEnc;</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">{byEnc </span>=<span style="color: rgba(0, 0, 0, 1)"> Convert.FromBase64String(strContent);</span><span style="color: rgba(0, 0, 255, 1)">using</span> (DESCryptoServiceProvider cryptoProvider = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DESCryptoServiceProvider()){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (MemoryStream ms = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MemoryStream(byEnc)){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (CryptoStream cst = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read)){StreamReader sr </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StreamReader(cst);</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sr.ReadToEnd();}}}}</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">{</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;}}</span><span style="color: rgba(0, 0, 255, 1)">#endregion</span><span style="color: rgba(0, 0, 255, 1)">#region</span> AES<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">string</span> AesIV_128 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">xiaoy設計.</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定義默認加密密鑰 16個字節 Unicode編碼為8個英文或漢字</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 按指定鍵值進行AES加密</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="plainText"></span><span style="color: rgba(0, 128, 0, 1)">要解密字符</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="strKey"></span><span style="color: rgba(0, 128, 0, 1)">加密時使用的鍵值 Unicode編碼 必須大于或等于8個英文或漢字</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> AES(<span style="color: rgba(0, 0, 255, 1)">string</span> strContent, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> strKey){</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span>.IsNullOrEmpty(strContent)) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;</span><span style="color: rgba(0, 0, 255, 1)">if</span> (strKey.Length > <span style="color: rgba(128, 0, 128, 1)">8</span>) strKey = strKey.Substring(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);</span><span style="color: rgba(0, 0, 255, 1)">using</span> (AesCryptoServiceProvider aesAlg = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AesCryptoServiceProvider()){aesAlg.Key </span>=<span style="color: rgba(0, 0, 0, 1)"> Encoding.Unicode.GetBytes(strKey);aesAlg.IV </span>=<span style="color: rgba(0, 0, 0, 1)"> Encoding.Unicode.GetBytes(AesIV_128);ICryptoTransform encryptor </span>=<span style="color: rgba(0, 0, 0, 1)"> aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);</span><span style="color: rgba(0, 0, 255, 1)">using</span> (MemoryStream msEncrypt = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MemoryStream()){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (CryptoStream csEncrypt = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (StreamWriter swEncrypt = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StreamWriter(csEncrypt)){swEncrypt.Write(strContent);}</span><span style="color: rgba(0, 0, 255, 1)">return</span> Convert.ToBase64String(msEncrypt.ToArray()); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回Base64密文方便傳輸</span>
}
}
}
}
/// <summary>
/// 按指定鍵值進行AES解密
/// </summary>
/// <param name=“strContent”>要解密字符</param>
/// <param name=“strKey”>加密時使用的鍵值 Unicode編碼 必須大于或等于8個英文或漢字</param>
/// <returns></returns>
public static string AESDecrypt(string strContent, string strKey)
{
if (string.IsNullOrEmpty(strContent)) return string.Empty;
if (strKey.Length > 8) strKey = strKey.Substring(0, 8);
//與加密時Base64對應
byte[] byEnc;
try
{
byEnc = Convert.FromBase64String(strContent);
//解密
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = Encoding.Unicode.GetBytes(strKey);
aesAlg.IV = Encoding.Unicode.GetBytes(AesIV_128);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Create a decryptor to perform the stream transform.</span>ICryptoTransform decryptor =<span style="color: rgba(0, 0, 0, 1)"> aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Create the streams used for decryption.</span><span style="color: rgba(0, 0, 255, 1)">using</span> (MemoryStream msDecrypt = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MemoryStream(byEnc)){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (CryptoStream csDecrypt = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (StreamReader srDecrypt = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StreamReader(csDecrypt)){</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> srDecrypt.ReadToEnd();}}}}}</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">{</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;}}</span><span style="color: rgba(0, 0, 255, 1)">#endregion</span><span style="color: rgba(0, 0, 255, 1)">#region</span> ECC<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 利用ecc生成key</span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 假設從A-->B進行信息發送</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="AKeyName"></span><span style="color: rgba(0, 128, 0, 1)">A的公鑰名稱 自身</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="BKey"></span><span style="color: rgba(0, 128, 0, 1)">B的公鑰</span><span style="color: rgba(128, 128, 128, 1)"></param></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></span><span style="color: rgba(0, 128, 0, 1)"> 生成A端用于交互信息的密鑰,可以用于AES加密的密鑰</span><span style="color: rgba(128, 128, 128, 1)"></returns></span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> ECC_EncodeKey(<span style="color: rgba(0, 0, 255, 1)">string</span> AKeyName,<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> BKey){</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] BKeybyte =<span style="color: rgba(0, 0, 0, 1)"> Convert.FromBase64String(BKey);</span><span style="color: rgba(0, 0, 255, 1)">using</span> (ECDiffieHellmanCng AClient = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ECDiffieHellmanCng(CngKey.Open(AKeyName)))</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">using (ECDiffieHellmanCng AClient = new ECDiffieHellmanCng())</span>
{
AClient.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
AClient.HashAlgorithm = CngAlgorithm.Sha256;
</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] MsgKey =<span style="color: rgba(0, 0, 0, 1)"> AClient.DeriveKeyMaterial(CngKey.Import(BKeybyte, CngKeyBlobFormat.EccPublicBlob));</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Convert.ToBase64String(MsgKey);}}</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 獲取自身的公鑰</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></span><span style="color: rgba(0, 128, 0, 1)">Base64編碼的字符串,接收端需要Base64解碼再使用</span><span style="color: rgba(128, 128, 128, 1)"></returns></span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> ECC_GetMyPublicKey(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> keyName){</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">CngKey.Exists(keyName)){</span><span style="color: rgba(0, 0, 255, 1)">using</span> (ECDiffieHellmanCng MyECC = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ECDiffieHellmanCng(CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, keyName))){MyECC.KeyDerivationFunction </span>=<span style="color: rgba(0, 0, 0, 1)"> ECDiffieHellmanKeyDerivationFunction.Hash;MyECC.HashAlgorithm </span>=<span style="color: rgba(0, 0, 0, 1)"> CngAlgorithm.Sha256;</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] Keybyte =<span style="color: rgba(0, 0, 0, 1)"> MyECC.PublicKey.ToByteArray();</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Convert.ToBase64String(Keybyte);}}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{</span><span style="color: rgba(0, 0, 255, 1)">using</span> (ECDiffieHellmanCng MyECC = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ECDiffieHellmanCng(CngKey.Open(keyName))){</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] Keybyte =<span style="color: rgba(0, 0, 0, 1)"> MyECC.PublicKey.ToByteArray();</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Convert.ToBase64String(Keybyte);}}}</span><span style="color: rgba(0, 0, 255, 1)">#endregion</span><span style="color: rgba(0, 0, 0, 1)">
}
}
這些算法已經在.net框架里面封裝好了,只需要引用System.Security.Cryptography庫,使用起來還是非常方便的。
使用示例:(下載Demo)
算法調用很簡單:
txtEncode.Text = EncodeHelper.MD5(txtMsg.Text);
txtEncode.Text = EncodeHelper.RSA(txtMsg.Text);
txtMsg.Text = "解密后的文本:" + EncodeHelper.RSADecrypt(txtEncode.Text);
txtEncode.Text = EncodeHelper.AES(txtMsg.Text, "密鑰可以是漢字哦");
txtMsg.Text = "解密后的文本:" + EncodeHelper.AESDecrypt(txtEncode.Text, "密鑰可以是漢字哦");
稍微復雜一點的是ECC+AES混合加密,用ECC加密AES的密鑰,而用AES加密要傳送的信息,接收端用ECC公鑰解密得到AES密鑰,然后解密信息。
該過程可以參考MSDN上的例子https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.ecdiffiehellmancng
string bkey
, akey
,akeyname
="akey",bkeyname
="bkey";private void btn_Ecc_Click(object sender
, EventArgs e
){akey
= EncodeHelper
.ECC_GetMyPublicKey(akeyname
); bkey
= EncodeHelper
.ECC_GetMyPublicKey(bkeyname
); string AClientAESKey
= EncodeHelper
.ECC_EncodeKey(akeyname
, bkey
); txtEncode
.Text
= EncodeHelper
.AES(txtMsg
.Text
, AClientAESKey
);}private void btn_eccrec_Click(object sender
, EventArgs e
){string BClientAESKey
= EncodeHelper
.ECC_EncodeKey(bkeyname
, akey
); txtMsg
.Text
="解密后的文本:"+ EncodeHelper
.AESDecrypt(txtEncode
.Text
, BClientAESKey
);}
總結
以上是生活随笔為你收集整理的常见加密算法简析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。