在数字化时代,数据安全成为了企业和个人关注的焦点。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位.....
///
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
{
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位.....
///
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位.....
///
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加密,我们可以更有效地保护敏感数据,防止数据泄露和未授权访问。然而,加密只是数据安全策略的一部分,结合其他安全措施,如访问控制、监控和审计,可以构建更全面的安全防护体系。