AES加密
在數(shù)字化時代,數(shù)據(jù)安全成為了企業(yè)和個人關注的焦點。AES(高級加密標準)作為一種廣泛采用的對稱加密算法,因其高效性和安全性,在保護敏感信息方面發(fā)揮著重要作用。本文將深入探討AES加密的工作原理、優(yōu)勢、實現(xiàn)方法以及在實際應用中的注意事項。
一、AES加密簡介
1.1 AES的歷史與發(fā)展
AES算法由比利時密碼學家Vincent Rijmen和Joan Daemen于1997年提出,并于2001年被美國國家標準與技術研究院(NIST)選為新的數(shù)據(jù)加密標準。AES取代了原有的DES(數(shù)據(jù)加密標準),提供了更強的安全性和更高的性能。
1.2 AES的工作原理
AES是一種基于替換-置換網(wǎng)絡(SPN)的加密算法,它使用相同的密鑰進行加密和解密。AES加密過程包括多個輪次,每一輪都包括以下四個步驟:字節(jié)替換(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和輪密鑰加(AddRoundKey)。解密過程與加密過程類似,但順序相反。
二、AES加密的優(yōu)勢
2.1 高效性
AES算法在硬件和軟件上都能高效運行,這使得它適用于各種計算環(huán)境,從高性能服務器到嵌入式設備。
2.2 安全性
AES提供了強大的安全性,即使在面對量子計算的威脅時,AES-256位版本仍然被認為是安全的。
2.3 靈活性
AES支持128位、192位和256位密鑰長度,用戶可以根據(jù)安全需求選擇合適的密鑰長度。
三、AES加密的實現(xiàn)
3.1 編程語言支持
大多數(shù)現(xiàn)代編程語言都提供了AES加密的庫或內(nèi)置支持。例如,Python的cryptography庫、Java的javax.crypto包和C#的System.Security.Cryptography命名空間。
3.2 實現(xiàn)步驟
------------------------這個方法是對key字節(jié)的處理(確保最終返回的密鑰字節(jié)數(shù)組長度為 16,符合 AES-128 位密鑰的長度要求)----------------------------
///
/// 128位處理key
///
/// 原字節(jié)
/// 處理key
///
private static byte[] GetAesKey(byte[] keyArray, string key)
{
byte[] newArray = new byte[16];
重點:如果輸入的密鑰字節(jié)數(shù)組長度小于 16,則進入下面的循環(huán)進行填充操作。也可以不必須是16位的長度,不夠的話會自動給你補充=號,一個=是兩個字節(jié)長度
if (keyArray.Length < 16)
{
for (int i = 0; i < newArray.Length; i++)
{
if (i >= keyArray.Length)
{
newArray[i] = 0;
}
else
{
newArray[i] = keyArray[i];
}
}
}
無論輸入密鑰字節(jié)數(shù)組的長度如何,最終都會返回一個長度為 16 的字節(jié)數(shù)組,作為處理后的 AES-128 位密鑰。
return newArray;
}
-------------------------------------------------------------------ASE加密方法-----------------------------------------
///
/// 使用AES加密字符串,按128位處理key
///
/// 加密內(nèi)容
/// 秘鑰,需要128位、256位.....
///
public static string AesEncrypt(string content, string key, bool autoHandle = true)
{
把key的通過Encoding.UTF8.值轉(zhuǎn)換為字節(jié)數(shù)組
byte[] keyArray = Encoding.UTF8.GetBytes(key);
if (autoHandle)
{
keyArray = GetAesKey(keyArray, key);
}
把content的通過Encoding.UTF8.值轉(zhuǎn)換為字節(jié)數(shù)組
byte[] toEncryptArray = Encoding.UTF8.GetBytes(content);
這一行主要是為了創(chuàng)建一個對稱加密算法對象,使用 Aes.Create() 創(chuàng)建的是 AES 加密算法的具體實現(xiàn)。對稱加密算法使用相同的密鑰進行加密和解密操作。
SymmetricAlgorithm des = Aes.Create();
將之前處理后的密鑰字節(jié)數(shù)組 keyArray 賦值給加密算法對象的 Key 屬性。這個密鑰將用于加密數(shù)據(jù)。
des.Key = keyArray;
ECB是一個加密的方式
des.Mode = CipherMode.ECB;
通過PKCS7進行填充
des.Padding = PaddingMode.PKCS7;
使用加密算法對象創(chuàng)建一個加密器。這個加密器將用于對數(shù)據(jù)進行加密操作。
ICryptoTransform cTransform = des.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
返回一個Base64的字符串放到數(shù)據(jù)庫里
return Convert.ToBase64String(resultArray);
}
注意:一般有的人會用加密區(qū)處理自己的登錄注冊方法,可能不知道這里該怎么用,調(diào)用以下是代碼(可以大概屢清一下思路)
-------------------------------------------------------------------登錄方法-----------------------------------------
///
/// 用戶信息添加方法
///
/// 要添加的用戶信息
///
public async Task
{
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;
因為上面的方法里有三個參數(shù),第一個是context 在這里放的就是account.AccountPwd,第二個參數(shù)是key 里面放的就是我在這個方法里訂的 var key = "asdasd"
var key = "asdasd";(再說一遍這個字節(jié)可以不用一定到16個字節(jié),不夠的系統(tǒng)還是會給你補=號,一個=號兩個字節(jié))
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
///
/// 內(nèi)容
/// 秘鑰,需要128位、256位.....
///
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 是你數(shù)據(jù)庫里加密之后的密碼,key是你在用戶信息添加方法
定義的var key="asdasd",autoHandle默認為true就不用管了
1.2這里返回的是Base64的解密結果
///
/// 使用AES解密字符串,按128位處理key
///
/// 內(nèi)容
/// 秘鑰,需要128位、256位.....
///
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 數(shù)據(jù)存儲
在數(shù)據(jù)庫中存儲敏感信息,如用戶密碼、個人信息等。
4.2 數(shù)據(jù)傳輸
在網(wǎng)絡傳輸中保護數(shù)據(jù)不被竊聽,如HTTPS協(xié)議中的使用。
4.3 移動設備
在智能手機和平板電腦上保護用戶數(shù)據(jù)。
五、注意事項與最佳實踐
5.1 密鑰管理
密鑰管理是加密過程中最重要的部分。應確保密鑰的安全存儲和傳輸,并定期更換密鑰。
5.2 使用強隨機數(shù)生成器
在生成密鑰和初始化向量(IV)時,使用強隨機數(shù)生成器以提高安全性。
5.3 避免實現(xiàn)自己的加密算法
使用經(jīng)過驗證的庫和算法,避免自行實現(xiàn)加密算法,以減少安全漏洞的風險。
結語
AES加密作為一種強大的數(shù)據(jù)保護工具,為現(xiàn)代數(shù)字世界提供了必要的安全保障。通過理解和應用AES加密,我們可以更有效地保護敏感數(shù)據(jù),防止數(shù)據(jù)泄露和未授權訪問。然而,加密只是數(shù)據(jù)安全策略的一部分,結合其他安全措施,如訪問控制、監(jiān)控和審計,可以構建更全面的安全防護體系。

浙公網(wǎng)安備 33010602011771號