AES加密

奥术發表於2024-11-21

在數字化時代,資料安全成為了企業和個人關注的焦點。AES(高階加密標準)作為一種廣泛採用的對稱加密演算法,因其高效性和安全性,在保護敏感資訊方面發揮著重要作用。本文將深入探討AES加密的工作原理、優勢、實現方法以及在實際應用中的注意事項。

一、AES加密簡介
1.1 AES的歷史與發展
AES演算法由比利時密碼學家Vincent Rijmen和Joan Daemen於1997年提出,並於2001年被美國國家標準與技術研究院(NIST)選為新的資料加密標準。AES取代了原有的DES(資料加密標準),提供了更強的安全性和更高的效能。

1.2 AES的工作原理
AES是一種基於替換-置換網路(SPN)的加密演算法,它使用相同的金鑰進行加密和解密。AES加密過程包括多個輪次,每一輪都包括以下四個步驟:位元組替換(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和輪金鑰加(AddRoundKey)。解密過程與加密過程類似,但順序相反。

二、AES加密的優勢
2.1 高效性
AES演算法在硬體和軟體上都能高效執行,這使得它適用於各種計算環境,從高效能伺服器到嵌入式裝置。

2.2 安全性
AES提供了強大的安全性,即使在面對量子計算的威脅時,AES-256位版本仍然被認為是安全的。

2.3 靈活性
AES支援128位、192位和256位金鑰長度,使用者可以根據安全需求選擇合適的金鑰長度。

三、AES加密的實現
3.1 程式語言支援
大多數現代程式語言都提供了AES加密的庫或內建支援。例如,Python的cryptography庫、Java的javax.crypto包和C#的System.Security.Cryptography名稱空間。

3.2 實現步驟
------------------------這個方法是對key位元組的處理(確保最終返回的金鑰位元組陣列長度為 16,符合 AES-128 位金鑰的長度要求)----------------------------
///


/// 128位處理key
///

/// 原位元組
/// 處理key
///
private static byte[] GetAesKey(byte[] keyArray, string key)
{
byte[] newArray = new byte[16];
重點:如果輸入的金鑰位元組陣列長度小於 16,則進入下面的迴圈進行填充操作。也可以不必須是16位的長度,不夠的話會自動給你補充=號,一個=是兩個位元組長度
if (keyArray.Length < 16)
{
for (int i = 0; i < newArray.Length; i++)
{
if (i >= keyArray.Length)
{
newArray[i] = 0;
}
else
{
newArray[i] = keyArray[i];
}
}
}
無論輸入金鑰位元組陣列的長度如何,最終都會返回一個長度為 16 的位元組陣列,作為處理後的 AES-128 位金鑰。
return newArray;
}

-------------------------------------------------------------------ASE加密方法-----------------------------------------
///


/// 使用AES加密字串,按128位處理key
///

/// 加密內容
/// 秘鑰,需要128位、256位.....
/// Base64字串結果
public static string AesEncrypt(string content, string key, bool autoHandle = true)
{

把key的透過Encoding.UTF8.值轉換為位元組陣列

byte[] keyArray = Encoding.UTF8.GetBytes(key);
if (autoHandle)
{
    keyArray = GetAesKey(keyArray, key);
}

 把content的透過Encoding.UTF8.值轉換為位元組陣列
byte[] toEncryptArray = Encoding.UTF8.GetBytes(content);

這一行主要是為了建立一個對稱加密演算法物件,使用 Aes.Create() 建立的是 AES 加密演算法的具體實現。對稱加密演算法使用相同的金鑰進行加密和解密操作。
SymmetricAlgorithm des = Aes.Create();

將之前處理後的金鑰位元組陣列 keyArray 賦值給加密演算法物件的 Key 屬性。這個金鑰將用於加密資料。
des.Key = keyArray;

ECB是一個加密的方式
des.Mode = CipherMode.ECB;

 透過PKCS7進行填充
des.Padding = PaddingMode.PKCS7;

使用加密演算法物件建立一個加密器。這個加密器將用於對資料進行加密操作。
ICryptoTransform cTransform = des.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

返回一個Base64的字串放到資料庫裡
return Convert.ToBase64String(resultArray);
}

注意:一般有的人會用加密區處理自己的登入註冊方法,可能不知道這裡該怎麼用,呼叫以下是程式碼(可以大概屢清一下思路)
-------------------------------------------------------------------登入方法-----------------------------------------
///


/// 使用者資訊新增方法
///

/// 要新增的使用者資訊
/// 受影響的行數
public async Task AddAccountAsync(Account account)
{
try
{
var accountData = await _accountRepository.GetAsync(p => p.AccountId == account.AccountId && p.AccountTypeId == account.AccountTypeId && !p.IsDeleted);

     if (accountData!=null)
     {
         return -1;
     }

     account.IsDeleted = false;

     因為上面的方法裡有三個引數,第一個是context 在這裡放的就是account.AccountPwd,第二個引數是key 裡面放的就是我在這個方法裡訂的 var key = "asdasd"
     var key = "asdasd";(再說一遍這個位元組可以不用一定到16個位元組,不夠的系統還是會給你補=號,一個=號兩個位元組)
     account.AccountPwd = AesEncrypt(account.AccountPwd, key);
     return await _accountRepository.AddAsync(account);
 }
 catch (Exception ex)
 {
     _logger.LogError("新增使用者資訊出錯" + ex.Message);
     throw;
 }

}

登入方法照舊我就不寫了

當然有加密方法肯定會有點對應的解密方法

-------------------------------------------------------------------解密方法-----------------------------------------

1.1這裡返回的是一個 UTF8解密結果
///


/// 使用AES解密字串,按128位處理key
///

/// 內容
/// 秘鑰,需要128位、256位.....
/// UTF8解密結果
public string AesDecrypt(string content, string key, bool autoHandle = true)
{
byte[] keyArray = Encoding.UTF8.GetBytes(key);
if (autoHandle)
{
keyArray = GetAesKey(keyArray, key);
}
byte[] toEncryptArray = Convert.FromBase64String(content);

        SymmetricAlgorithm des = Aes.Create();
        des.Key = keyArray;
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = des.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return Encoding.UTF8.GetString(resultArray);
    }

直接複製就可以用了 這裡的 content 是你資料庫里加密之後的密碼,key是你在使用者資訊新增方法
定義的var key="asdasd",autoHandle預設為true就不用管了

1.2這裡返回的是Base64的解密結果

///


/// 使用AES解密字串,按128位處理key
///

/// 內容
/// 秘鑰,需要128位、256位.....
/// Base64解密結果
public string AesDecrypt(string content, string key, bool autoHandle = true)
{
byte[] keyArray = Encoding.UTF8.GetBytes(key);
if (autoHandle)
{
keyArray = GetAesKey(keyArray, key);
}
byte[] toEncryptArray = Convert.FromBase64String(content);

        SymmetricAlgorithm des = Aes.Create();
        des.Key = keyArray;
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = des.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return Encoding.Base64.GetString(resultArray);
    }

四、AES加密的應用場景
4.1 資料儲存
在資料庫中儲存敏感資訊,如使用者密碼、個人資訊等。

4.2 資料傳輸
在網路傳輸中保護資料不被竊聽,如HTTPS協議中的使用。

4.3 移動裝置
在智慧手機和平板電腦上保護使用者資料。

五、注意事項與最佳實踐
5.1 金鑰管理
金鑰管理是加密過程中最重要的部分。應確保金鑰的安全儲存和傳輸,並定期更換金鑰。

5.2 使用強隨機數生成器
在生成金鑰和初始化向量(IV)時,使用強隨機數生成器以提高安全性。

5.3 避免實現自己的加密演算法
使用經過驗證的庫和演算法,避免自行實現加密演算法,以減少安全漏洞的風險。

結語
AES加密作為一種強大的資料保護工具,為現代數字世界提供了必要的安全保障。透過理解和應用AES加密,我們可以更有效地保護敏感資料,防止資料洩露和未授權訪問。然而,加密只是資料安全策略的一部分,結合其他安全措施,如訪問控制、監控和審計,可以構建更全面的安全防護體系。

相關文章