一、AES-CBC加密應用場景
AES(Advanced Encryption Standard)作為全球公認的安全加密標準,廣泛使用在以下場景:
- API通信加密:保護HTTP接口傳輸的敏感數據(如身份令牌、支付信息)
- 文件安全存儲:加密本地配置文件、數據庫連接字符串等
- 用戶隱私保護:加密存儲密碼、身份證號等PII(個人身份信息)
- 跨平臺數據交換:與Java/Python等其他語言實現的加密系統互通
- 物聯網設備通信:保障設備與控制端的數據傳輸安全
其中CBC模式(密碼塊鏈模式)通過引入初始化向量(IV),能有效防止相同明文生成相同密文的問題,安全性優于ECB模式。
二、工具類完整實現代碼
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;/// <summary>
/// AES-CBC加密工具類(128/192/256位密鑰)
/// </summary>
public static class AesCbcHelper
{/// <summary>/// AES加密(輸出Base64字符串)/// </summary>/// <param name="plainText">明文</param>/// <param name="key">密鑰(16/24/32字節)</param>/// <param name="iv">初始化向量(16字節)</param>public static string Encrypt(string plainText, byte[] key, byte[] iv){// 參數校驗ValidateKeyAndIV(key, iv);using (Aes aesAlg = Aes.Create()){// 配置加密參數aesAlg.Key = key;aesAlg.IV = iv;aesAlg.Mode = CipherMode.CBC; // 設置為CBC模式[4,9](@ref)aesAlg.Padding = PaddingMode.PKCS7; // 使用PKCS#7填充[3,6](@ref)// 創建加密器ICryptoTransform encryptor = aesAlg.CreateEncryptor();// 執行加密using (MemoryStream msEncrypt = new MemoryStream()){using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)){using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)){swEncrypt.Write(plainText);}return Convert.ToBase64String(msEncrypt.ToArray());}}}}/// <summary>/// AES解密(輸入Base64字符串)/// </summary>public static string Decrypt(string cipherText, byte[] key, byte[] iv){ValidateKeyAndIV(key, iv);using (Aes aesAlg = Aes.Create()){aesAlg.Key = key;aesAlg.IV = iv;aesAlg.Mode = CipherMode.CBC;aesAlg.Padding = PaddingMode.PKCS7;ICryptoTransform decryptor = aesAlg.CreateDecryptor();using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText))){using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)){using (StreamReader srDecrypt = new StreamReader(csDecrypt)){return srDecrypt.ReadToEnd();}}}}}/// <summary>/// 密鑰與IV校驗/// </summary>private static void ValidateKeyAndIV(byte[] key, byte[] iv){if (!IsValidKeySize(key.Length))throw new ArgumentException("密鑰長度應為16/24/32字節");if (iv.Length != 16)throw new ArgumentException("IV長度必須為16字節");}/// <summary>/// 驗證密鑰長度/// </summary>private static bool IsValidKeySize(int keySize){return keySize == 16 || keySize == 24 || keySize == 32; // 支持128/192/256位[9](@ref)}
}
三、使用教程(控制臺示例)
class Program
{static void Main(){try{// 原始數據string original = "CSDN開發者社區2023";// 生成密鑰和IV(生產環境應從安全存儲獲取)byte[] key = Encoding.UTF8.GetBytes("ThisIsASecretKey16"); // 16字節密鑰byte[] iv = Encoding.UTF8.GetBytes("16ByteInitVector"); // 16字節IV// 加密string encrypted = AesCbcHelper.Encrypt(original, key, iv);Console.WriteLine($"加密結果:{encrypted}");// 解密string decrypted = AesCbcHelper.Decrypt(encrypted, key, iv);Console.WriteLine($"解密結果:{decrypted}");}catch (CryptographicException ex){Console.WriteLine($"加解密失敗:{ex.Message}");}}
}
四、關鍵功能說明
1. 參數驗證機制
? 密鑰長度強制校驗(16/24/32字節)
? IV長度必須為16字節
? 自動處理Base64編解碼
2. 安全增強特性
? 使用CBC模式防止模式攻擊
? 采用PKCS#7填充標準
? 通過using
語句確保資源釋放
3. 異常處理建議
? 捕獲CryptographicException
處理加解密失敗
? 使用ArgumentException
提示參數錯誤
? 建議在生產環境中記錄操作日志
五、注意事項
- 密鑰管理:切勿硬編碼密鑰,應使用密鑰管理系統(如Azure Key Vault)
- IV生成規則:每次加密應生成隨機IV(示例為演示固定值)
- 性能優化:對大數據流建議采用分塊加密
- 跨平臺互通:與其他語言對接需統一字符編碼(推薦UTF-8)