使用C#實(shí)現(xiàn)AES加密與解密的示例
1. AES 加密簡(jiǎn)介
AES(Advanced Encryption Standard,高級(jí)加密標(biāo)準(zhǔn))是一種對(duì)稱(chēng)加密算法,意味著加密和解密使用相同的密鑰。AES 支持不同的密鑰長(zhǎng)度,如 128 位、192 位和 256 位。為了簡(jiǎn)便起見(jiàn),本文將使用 128 位密鑰(即 16 字節(jié))進(jìn)行加密。
2. C# 中的 AES 加密與解密
在 C# 中,System.Security.Cryptography 命名空間提供了內(nèi)置的 AES 加密支持。通過(guò) Aes 類(lèi),我們可以輕松實(shí)現(xiàn)加密和解密操作。以下是一個(gè)完整的示例代碼,展示了如何在 C# 中進(jìn)行 AES 加密和解密。
class Program
{
private static string key = "1234567890123456"; // 16字節(jié)密鑰,AES-128
private static string iv = "1234567890123456"; // 16字節(jié)IV(初始化向量)
// 加密函數(shù)
public static string Encrypt(string plainText)
{
using (Aes aesAlg = Aes.Create()) // 創(chuàng)建AES加密實(shí)例
{
aesAlg.Key = Encoding.UTF8.GetBytes(key); // 設(shè)置密鑰
aesAlg.IV = Encoding.UTF8.GetBytes(iv); // 設(shè)置初始化向量
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); // 創(chuàng)建加密器
using (MemoryStream msEncrypt = new MemoryStream()) // 用于存儲(chǔ)加密后的數(shù)據(jù)
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) // 創(chuàng)建加密數(shù)據(jù)流
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) // 寫(xiě)入加密流
{
swEncrypt.Write(plainText); // 寫(xiě)入明文數(shù)據(jù)
}
}
// 返回加密后的數(shù)據(jù),轉(zhuǎn)換為Base64字符串
return Convert.ToBase64String(msEncrypt.ToArray());
}
}
}
// 解密函數(shù)
public static string Decrypt(string cipherText)
{
using (Aes aesAlg = Aes.Create()) // 創(chuàng)建AES實(shí)例
{
aesAlg.Key = Encoding.UTF8.GetBytes(key); // 設(shè)置密鑰
aesAlg.IV = Encoding.UTF8.GetBytes(iv); // 設(shè)置初始化向量
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); // 創(chuàng)建解密器
using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText))) // 將Base64字符串轉(zhuǎn)換為字節(jié)數(shù)組并讀取
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) // 創(chuàng)建解密數(shù)據(jù)流
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt)) // 從解密流中讀取數(shù)據(jù)
{
return srDecrypt.ReadToEnd(); // 返回解密后的明文
}
}
}
}
}
static void Main(string[] args)
{
string originalText = "Hello, AES Encryption!"; // 原始明文
Console.WriteLine("Original Text: " + originalText); // 輸出原始文本
string encryptedText = Encrypt(originalText); // 加密
Console.WriteLine("Encrypted Text: " + encryptedText); // 輸出加密后的文本
string decryptedText = Decrypt(encryptedText); // 解密
Console.WriteLine("Decrypted Text: " + decryptedText); // 輸出解密后的文本
Console.ReadKey();
}
}3. 代碼詳解
密鑰和初始化向量(IV):
- 在 AES 加密中,密鑰長(zhǎng)度和初始化向量(IV)的長(zhǎng)度非常重要。這里使用了 16 字節(jié)的密鑰(128 位),也使用了 16 字節(jié)的 IV。這是 AES-128 加密所需的標(biāo)準(zhǔn)設(shè)置。
加密過(guò)程:
- 使用
Aes.Create()創(chuàng)建 AES 實(shí)例。 - 設(shè)置密鑰 (
Key) 和初始化向量 (IV)。 - 使用
CreateEncryptor創(chuàng)建加密器,接著通過(guò)CryptoStream和MemoryStream實(shí)現(xiàn)數(shù)據(jù)流的加密。 - 最終將加密后的字節(jié)流轉(zhuǎn)換為 Base64 字符串,方便以文本形式存儲(chǔ)或傳輸。
- 使用
解密過(guò)程:
- 解密過(guò)程與加密過(guò)程相反。我們使用相同的密鑰和 IV,通過(guò)
CreateDecryptor解密數(shù)據(jù)流,最終恢復(fù)原始文本。
- 解密過(guò)程與加密過(guò)程相反。我們使用相同的密鑰和 IV,通過(guò)
4. 示例輸出
假設(shè)我們加密并解密一段文本 "Hello, AES Encryption!",輸出將如下所示:
Original Text: Hello, AES Encryption! Encrypted Text: P5/fGFh/sUsYOGYOg7wDIA== Decrypted Text: Hello, AES Encryption!
可以看到,原始文本被成功加密并轉(zhuǎn)換為一個(gè) Base64 編碼的字符串,然后又解密回原始的明文。
5. 安全注意事項(xiàng)
在實(shí)際應(yīng)用中,密鑰和初始化向量的生成應(yīng)該更為復(fù)雜且具有隨機(jī)性,以提高加密的安全性。避免使用固定的密鑰和 IV,尤其是在生產(chǎn)環(huán)境中。
例如,可以使用 RNGCryptoServiceProvider 來(lái)生成一個(gè)隨機(jī)的密鑰和 IV,而不是手動(dòng)指定它們。這樣可以增強(qiáng)加密的強(qiáng)度,確保每次加密都具有獨(dú)一無(wú)二的安全性。
6. 結(jié)語(yǔ)
通過(guò)上述示例,我們學(xué)習(xí)了如何使用 C# 實(shí)現(xiàn) AES 加密和解密。AES 是一種高效且安全的對(duì)稱(chēng)加密算法,廣泛應(yīng)用于各類(lèi)數(shù)據(jù)保護(hù)和信息安全場(chǎng)景。掌握它的實(shí)現(xiàn),能幫助我們?cè)陂_(kāi)發(fā)中保護(hù)敏感數(shù)據(jù),確保應(yīng)用程序的安全性。
到此這篇關(guān)于使用C#實(shí)現(xiàn)AES加密與解密的示例的文章就介紹到這了,更多相關(guān)C# AES加密與解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#自定義類(lèi)型強(qiáng)制轉(zhuǎn)換實(shí)例分析
這篇文章主要介紹了C#自定義類(lèi)型強(qiáng)制轉(zhuǎn)換的方法,實(shí)例分析了C#類(lèi)型轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2015-05-05
C#實(shí)現(xiàn)win10 uwp 右擊浮出窗在點(diǎn)擊位置
本文主要讓MenuFlyout出現(xiàn)在我們右擊位置。我們建一個(gè)ListView,然后綁定后臺(tái),在我們ListView要右擊顯示我們的浮出,要求我們的浮出在我們點(diǎn)擊位置2016-10-10
C#基于正則表達(dá)式抓取a標(biāo)簽鏈接和innerhtml的方法
這篇文章主要介紹了C#基于正則表達(dá)式抓取a標(biāo)簽鏈接和innerhtml的方法,結(jié)合實(shí)例形式分析了C#使用正則表達(dá)式進(jìn)行頁(yè)面元素的匹配與抓取相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
Unity shader實(shí)現(xiàn)頂點(diǎn)動(dòng)畫(huà)波動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity shader實(shí)現(xiàn)頂點(diǎn)動(dòng)畫(huà)波動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
基于C#實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器
這篇文章主要介紹了如何基于C#實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器,考慮到需求中的界面友好和跨版本兼容性,我們可以選擇選擇Windows Forms作為開(kāi)發(fā)平臺(tái),Windows Forms提供了一個(gè)簡(jiǎn)單而強(qiáng)大的方法來(lái)創(chuàng)建桌面應(yīng)用程序,文中通過(guò)代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下2024-05-05

