日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常见加密算法简析

發布時間:2023/12/16 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常见加密算法简析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="scr"&gt;</span><span style="color: rgba(0, 128, 0, 1)">原始string數據</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;</span><span style="color: rgba(0, 128, 0, 1)">加密后的數據</span><span style="color: rgba(128, 128, 128, 1)">&lt;/returns&gt;</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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="scr"&gt;</span><span style="color: rgba(0, 128, 0, 1)">原始string數據</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</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&gt;&lt;@</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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="strContent"&gt;</span><span style="color: rgba(0, 128, 0, 1)">要加密字符</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="strKey"&gt;</span><span style="color: rgba(0, 128, 0, 1)">自定義鍵值 ASCII編碼 必須大于或等于8個字符</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</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 &gt; <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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="strContent"&gt;</span><span style="color: rgba(0, 128, 0, 1)">要解密字符</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="strKey"&gt;</span><span style="color: rgba(0, 128, 0, 1)">加密時使用的鍵值 ASCII編碼 必須大于或等于8個字符</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</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 &gt; <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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="plainText"&gt;</span><span style="color: rgba(0, 128, 0, 1)">要解密字符</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="strKey"&gt;</span><span style="color: rgba(0, 128, 0, 1)">加密時使用的鍵值 Unicode編碼 必須大于或等于8個英文或漢字</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</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 &gt; <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)">&lt;summary&gt;</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--&gt;B進行信息發送</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="AKeyName"&gt;</span><span style="color: rgba(0, 128, 0, 1)">A的公鑰名稱 自身</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="BKey"&gt;</span><span style="color: rgba(0, 128, 0, 1)">B的公鑰</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;</span><span style="color: rgba(0, 128, 0, 1)"> 生成A端用于交互信息的密鑰,可以用于AES加密的密鑰</span><span style="color: rgba(128, 128, 128, 1)">&lt;/returns&gt;</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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;</span><span style="color: rgba(0, 128, 0, 1)">Base64編碼的字符串,接收端需要Base64解碼再使用</span><span style="color: rgba(128, 128, 128, 1)">&lt;/returns&gt;</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); //A先獲取自身的publickeybkey = EncodeHelper.ECC_GetMyPublicKey(bkeyname); //B先獲取自身的publickeystring AClientAESKey = EncodeHelper.ECC_EncodeKey(akeyname, bkey); //用bkey生成用于AES算法的keytxtEncode.Text = EncodeHelper.AES(txtMsg.Text, AClientAESKey);}private void btn_eccrec_Click(object sender, EventArgs e){string BClientAESKey = EncodeHelper.ECC_EncodeKey(bkeyname, akey); //用akey生成用于AES算法的keytxtMsg.Text ="解密后的文本:"+ EncodeHelper.AESDecrypt(txtEncode.Text, BClientAESKey);}

總結

以上是生活随笔為你收集整理的常见加密算法简析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。