首页 > 其他分享 >AES加密

AES加密

时间:2023-11-29 15:34:29浏览次数:35  
标签:AES 加密 字节 生成 密钥 明文

AES加密

高级加密标准(AES,Advanced Encryption Standard)是一种对称密钥加密算法,用于保护敏感信息。它取代了原先的数据加密标准(DES),因为DES已经不再被认为足够安全

密钥是AES算法实现加密和解密的根本,对称加密对明文的加密和解密需要使用同一个密钥

AES支持三种长度的密钥:128位,192位,256位,对应AES128,AES192,AES256

填充

AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit,这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果

基本步骤

1、填充分组:

AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit,这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果

填充涉及以下三种填充模式:

NoPadding:不做任何填充,但是要求明文必须是16字节的整数倍

PKCS5Padding(默认):如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

2、密钥扩展:

密钥扩展是AES算法中的一个关键步骤,它负责将初始密钥扩展为每轮加密所需的轮密钥也叫子密钥(Round Keys)。AES支持三种密钥长度:128位、192位和256位,密钥扩展的细节会根据不同的密钥长度有所不同

密钥扩展的基本思想是利用初始密钥生成一系列的轮密钥,这些轮密钥将在加密的每一轮中与状态矩阵进行异或运算。密钥扩展包括以下主要步骤:

  1. 轮常量生成(Round Constants): 针对每一轮,生成一个固定的常量,用于与某一部分扩展密钥进行异或。

  2. 子密钥生成(Key Schedule): 将初始密钥分割成多个字,并对这些字进行一系列变换,生成每一轮所需的轮密钥。这个过程包括:

    • 初始轮密钥生成: 将初始密钥的字直接作为初始轮密钥。

    • 后续轮密钥生成: 初始轮密钥后面的每个字都通过一系列的变换生成。这个过程涉及字的旋转、S盒替代和与轮常量的异或运算。

不同密钥长度下,轮密钥的生成步骤和数量会有所不同。例如,128位密钥生成10轮的轮密钥,192位密钥生成12轮的轮密钥,256位密钥生成14轮的轮密钥。

密钥扩展的目的是引入密钥的复杂性,使得加密算法更加强大。它确保了每一轮加密使用的密钥都是唯一的,并且与初始密钥之间存在一定的复杂关系,提高了算法的安全性

3、初始轮加密(Initial Round):

在第一轮中,将明文与轮密钥进行异或运算。

4、多轮加密:

除了最后一轮,其余每一轮都包括四个步骤:SubBytes、ShiftRows、MixColumns、AddRoundKey。

  • SubBytes: 这一步骤是通过一个称为S盒(Substitution Box)的查找表进行的。S盒是一个16×16的字节替代表,用于将输入的每个字节替换为预定义的字节。S盒的目的是引入非线性,增强算法的安全性。S盒中的元素是经过数学运算选定的,确保了一定的代替性和扩散性

  • ShiftRows: 这一步骤涉及对AES状态矩阵的行进行位移操作。状态矩阵是一个4×4的字节矩阵,存储了输入数据。ShiftRows的目的是在不改变列的顺序的情况下,对状态矩阵的每一行进行循环左移。具体地:

    • 第1行不动。

    • 第2行左移1字节。

    • 第3行左移2字节。

    • 第4行左移3字节。

  • MixColumns: 这一步骤对状态矩阵的每一列进行混淆操作。MixColumns使用一个特定的矩阵乘法,将每一列映射成一个新的列。这个步骤的目的是增加算法的混淆性质

  • AddRoundKey: 在每一轮中,状态矩阵都与该轮的轮密钥进行异或操作。轮密钥是通过密钥扩展算法生成的

5、最后一轮

最后一轮没有MixColumns步骤,只包含SubBytes、ShiftRows、AddRoundKey。

6、加密完成:

经过多轮加密后,得到密文

 

AES算法是一个迭代的、对称的加密算法,其安全性依赖于选择的密钥长度。目前,128位的AES密钥仍然被认为足够安全,但对于更高级的安全需求,可以考虑使用192位或256位的密钥。 AES是一种快速、高效的加密算法,被广泛应用于安全通信和数据存储领域

标签:AES,加密,字节,生成,密钥,明文
From: https://www.cnblogs.com/yogayao/p/17864976.html

相关文章

  • 深入了解MD5加密技术及其应用与局限
    一、MD5简介MD5(MessageDigestAlgorithm5)是一种单向散列函数,由美国密码学家罗纳德·李维斯特(RonaldLinnRivest)于1991年发明。它主要用于将任意长度的消息映射成固定长度的摘要,从而实现消息的完整性验证、数字签名等功能。MD5加密技术在我国网络安全领域有着广泛的应用,但近年来......
  • C# MD5加密/解密方法
    usingSystem.IO;usingSystem.Security.Cryptography;usingSystem.Text;namespaceAssist{publicstaticclassMD5Helper{#regionMD5加密///<summary>///MD5加密///</summary>///<para......
  • MD5加密算法
    MD5MD5是一种不可逆的加密算法。可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致md5的特性压缩性:任意长度的数据,算出的MD5值长度都是固定的。容易计算:从原数据计算出MD5值很容易。抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都......
  • 深入了解PBKDF2加密技术:原理与实践
    摘要:本文详细介绍了PBKDF2(Password-BasedKeyDerivationFunction2)加密技术,包括其原理、算法流程和实际应用,旨在帮助读者更好地理解这一重要的加密方法。PBKDF2在线加密--一个覆盖广泛主题工具的高效在线平台(amd794.com)https://amd794.com/pbkdf2一、引言在当今数字时......
  • springboot 在配置文件中对敏感信息加密
    pom文件引入2.1.0版本对应springboot2.1.4release<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.0</version></dependency>配......
  • 解决Windows Server 2012加密套件过时的问题
    给自己网站加了SSL证书后,发现在360极速浏览器浏览时,会显示加密套件已经过时。一直以为是.cn域名的问题,后面才发现是IIS上面加密套件过时的问题。 后面我还以为是要切换到TLS1.3,因为我另外一个SVN服务器使用的是TLS1.3,360提示没有过时。后面我看到了博客园的也是TLS1.2的,只是......
  • 深入了解Rabbit加密技术:原理、实现与应用
    一、引言在信息时代,数据安全愈发受到重视,加密技术作为保障信息安全的核心手段,得到了广泛的研究与应用。Rabbit加密技术作为一种新型加密方法,具有较高的安全性和便捷性。本文将对Rabbit加密技术进行深入探讨,分析其原理、实现及应用,以期为加密技术的研究和应用提供参考。Rabbit加密解......
  • 深入了解Rabbit加密技术:原理、实现与应用
    一、引言在信息时代,数据安全愈发受到重视,加密技术作为保障信息安全的核心手段,得到了广泛的研究与应用。Rabbit加密技术作为一种新型加密方法,具有较高的安全性和便捷性。本文将对Rabbit加密技术进行深入探讨,分析其原理、实现及应用,以期为加密技术的研究和应用提供参考。Rabbit......
  • C/C++ 常用加密与解密算法
    计算机安全和数据隐私是现代应用程序设计中至关重要的方面。为了确保数据的机密性和完整性,常常需要使用加密和解密算法。C++是一种广泛使用的编程语言,提供了许多加密和解密算法的实现。本文将介绍一些在C++中常用的加密与解密算法,这其中包括Xor异或、BASE64、AES、MD5、SHA256、RS......
  • 加密数字
    publicclassjiami{//对密码进行加密操作。比如1983.publicstaticvoidmain(String[]args){System.out.println(result(1983));//结果为8346}publicstaticStringresult(intnumber){//number用来输入数字int[]numbers=split(nu......