首页 > 其他分享 >AES加密

AES加密

时间:2024-11-21 15:29:15浏览次数:1  
标签:AES 加密 des keyArray 密钥 key

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

标签:AES,加密,des,keyArray,密钥,key
From: https://www.cnblogs.com/xiso/p/18560874

相关文章

  • 写一个加密字符串的方法
    /***加密字符串*@param{string}str需要加密的字符串*@param{string}key加密密钥*@returns{string}加密后的字符串*/functionencryptString(str,key){if(!str){return"";}try{//使用CryptoJS库进行AES加密constkeyUt......
  • 安全基础:数字信封、数字签名、数字证书(加签验签,加密解密)
    数字签名的作用:完整性没有被篡改;不可抵赖性,用自己私钥签名的明文(签名是独有的私自的),只有用自己的公钥才能解密。数字信封的作用:用接收方的公钥加密形成信封(信封的内容是公开的);保证数据传输的真实性和不可窥探性(确保客户端随机生成的对称秘钥加密安全传输)在互联网安全通信中......
  • CryptoJS加密(网络安全)
    CryptoJS(crypto.js)为JavaScript提供了各种各样的加密算法。des对称加密在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解......
  • 想要给文件加密?这8款实用的文件加密软件2024办公必备
    在当今信息化的社会中,数据安全越来越受到重视,无论是企业用户还是个人用户,都希望通过加密来保护文件的隐私和安全。以下为您整理了8款实用的文件加密软件,每款工具都功能强大,使用便捷,助您在2024年轻松保障数据安全。1.安秉网盾适合人群:企业用户安秉网盾文件加密是一款高效、......
  • 2024年想要加密文件?常用10款文件加密软件分享|企业办公必备!
    在数字化时代,数据安全是企业运营和个人隐私保护的重要一环。为了有效防止数据泄露,选择一款合适的文件加密软件至关重要。以下是2024年推荐的10款常用文件加密软件,这些软件各具特色,能够满足不同企业和个人的加密需求。1.安秉网盾安秉网盾是一款专注于企业级信息安全管理的工......
  • i春秋-GetFlag(md5加密,字符串比较绕过)
    练习平台地址竞赛中心题目描述 题目内容你好,单身狗,这是一个迷你文件管理器,你可以登录和下载文件,甚至得到旗帜 点击登录 发现capture需要满足条件substr(md5(captcha),0,6)=xxxxxx编写python脚本破解验证码importhashlibdefgetMd5(index):"""函......
  • Oracle数据库安全扫描1158/3938端口出现弱SSL加密算法解决方法之一
    问题复述某国企项目现场反应安全扫描出部署某历史项目的Windows服务器上的1158及3938两个端口出现了弱SSL加密算法漏洞,要求整改。经过核实,该Windows服务器上部署了tomcat与Oracle11g数据库,其中1158和3938两个端口均为Oracle数据库所使用。处理思路确认1158和3938作用:如果没......
  • zip伪加密
    解题思路        题目给了个文件夹,内部文件是flag.txt,但压缩包有密码,无法直接获取文件。        从题目:zip伪加密来看,应该是其实没有加密,但是却显示加密,所以看看有没有其他突破口。binwalk无法直接破解压缩包。        查询zip伪加密,获知原......
  • python RSA加密解密
    RSA加密和解密是一种常见的非对称加密方法,主要用于保护数据的安全性。在RSA加密中,使用公钥对数据进行加密,使用私钥进行解密。pipinstallpycryptodomefromCrypto.PublicKeyimportRSAfromCrypto.CipherimportPKCS1_OAEPimportbinasciidefgenerate_keys():#生......
  • Python程序py代码加密方法
    Python程序语言使用方便,应用范围广,但Python的代码加密保护是一个问题,下面介绍一种专业的python程序py代码加密方法,可以有效地保护源代码! 下载最新加密锁开发工具包http://chinadlp.com/?list-DriveDownload.html 完全默认安装后,打开如下开发工具 在安装目录下找到python......