AES加密

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

posted @ 2024-11-21 15:40  奥术  阅读(78)  评论(0编辑  收藏  举报