C# 使用 AES 演算法進行加解密 + Base64編碼與解碼

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