加解密需求很常遇到,遇到就順手將可用的解法留下。
提醒:
1. DES、MD5、SHA1 安全性不夠,建議改AES/SHA256 以上的演算法。
2. AES基本使用128位元密鑰,為了資安建議使用196位元或是更高的256位元。
3. 密文(Base64String)用於URL前需要先UrlEncode處理。
範例:
金鑰(16位元): TestCryptoKey123
明文: Test Content
加密結果: YZFVF4XNeXBlsKa43LOznw==
解密結果: TestContent
/// <summary>
/// AES加密
/// </summary>
/// <param name="Content">明文(string)</param>
/// <param name="CryptoKey">金鑰</param>
/// <returns>密文(Base64String)</returns>
public static string AesEncrypt(string Content, string CryptoKey)
{
if (string.IsNullOrEmpty(Content)) return null;
//string 轉成 byte
Byte[] encryptArray = Encoding.UTF8.GetBytes(Content);
Byte[] cryptoKeyArray = Encoding.UTF8.GetBytes(CryptoKey);
//Rijndael加密法
RijndaelManaged rijndaelManaged = new RijndaelManaged
{
Key = cryptoKeyArray, //設定金鑰
Mode = CipherMode.ECB, // 使用ECB
Padding = PaddingMode.PKCS7 //填充模式
};
ICryptoTransform cryptoTransform = rijndaelManaged.CreateEncryptor();
//加密
Byte[] resultArray = cryptoTransform.TransformFinalBlock(encryptArray, 0, encryptArray.Length);
return Convert.ToBase64String(resultArray);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="Content">密文(Base64String)</param>
/// <param name="CryptoKey">金鑰</param>
/// <returns>明文(string)</returns>
public static string AesDecrypt(string Content, string CryptoKey)
{
if (string.IsNullOrEmpty(Content)) return null;
//Base64String 轉成 byte
Byte[] decryptArray = Convert.FromBase64String(Content);
//string 轉成 byte
Byte[] cryptoKeyArray = Encoding.UTF8.GetBytes(CryptoKey);
//Rijndael加密法
RijndaelManaged rm = new RijndaelManaged
{
Key = cryptoKeyArray, //設定金鑰
Mode = CipherMode.ECB, // 使用ECB
Padding = PaddingMode.PKCS7 //填充模式
};
ICryptoTransform cTransform = rm.CreateDecryptor();
//解密
Byte[] resultArray = cTransform.TransformFinalBlock(decryptArray, 0, decryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
參考資料:
C#開發中常用的加密解密方法
維基-區塊加密法工作模式
GOLANG 實作 AES ECB 與 PKCS#7 PKCS#5
相關文章:
無
嘗試以自己的角度來整理並紀錄,也許會對一些人有幫助。
文章有錯、參考聯結有漏或是連結失效..等,還請幫忙告知,謝謝。
另外參考資料中有很多更棒的文章,建議多看看。