Aes 類別代表抽象基底類別,進階加密標準 (AES) 的所有實作都必須從它繼承。
使用【System.Security.Cryptography】中的 AES 驗算法來為字串加解密
將程式寫成簡單的涵式,如果遇到錯誤的問題則返回空值,以防被猜到漏洞
為了以防萬一,以下範例增加了Base64一層防護
(用於key被知道後也無法馬上猜到正確文字)
AesEncrypt(Base64Encode("TEST"), "MykeY!!!!!this!")//加密 string pwd=Base64Decode(AesDecrypt("(加密後的秘文)","MykeY!!!!!this!")) //解密
以下為加密+BOASE64涵式
/// AES 加密 /// /// 明文(待加密) /// 密文 /// public static string AesEncrypt(string str, string key) { if (string.IsNullOrEmpty(str)) return null; if (key.Length != 16) 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, 0, resultArray.Length); }/// AES 解密 /// /// 明文(待解密) /// 密文 /// public static string AesDecrypt(string str, string key) { try { if (string.IsNullOrEmpty(str)) return null; // 判断Key是否为16位 if (key.Length != 16) 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); } catch (Exception) { return ""; } }
//編碼成Base64 public static string Base64Encode(string AStr) { return Convert.ToBase64String(Encoding.UTF8.GetBytes(AStr)); } //Base64解密 public static string Base64Decode(string ABase64) { try { return Encoding.UTF8.GetString(Convert.FromBase64String(ABase64)); } catch (Exception) { return ""; } }
參考
https://docs.microsoft.com/zh-tw/dotnet/api/system.security.cryptography.aes?view=netframework-4.8
https://docs.microsoft.com/zh-tw/dotnet/api/system.convert.tobase64string?view=netframework-4.8
https://dotblogs.com.tw/daniel/2019/05/06/223004