[C#][AES]AES加密範例

加解密需求很常遇到,遇到就順手將可用的解法留下。

提醒: 
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

相關文章:

嘗試以自己的角度來整理並紀錄,也許會對一些人有幫助。

文章有錯、參考聯結有漏或是連結失效..等,還請幫忙告知,謝謝。
另外參考資料中有很多更棒的文章,建議多看看。