【对称秘钥】AES
🏬【对称秘钥】AES
2022-3-1
| 2023-10-28
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Oct 28, 2023 10:42 AM
Parent item
领域
AES(Advanced Encryption Standard)全称为高级加密标准。AES采用的算法名称叫Rijndael对称密码算法。采用分组密码算法机制,每个分组固定长度128位。密钥长度可以是128位(16个字节)、192位(24个字节)或256位(32个字节).

加密秘钥扩展

由于AES加密内部需要执行多轮加密,例如AES-128一共会执行11轮加密,而每一轮的密钥都是不同的,AES采用一个简单快速的混合操作,根据初始密钥迭代生成后面10轮计算过程中所需的密钥,该过程也称为密钥扩展,具体为:输入值是4个字(16字节),输出值是一个由44个字组成(176字节)的一维线性数组。密钥扩展的伪代码如下所示:
下面以生成第二轮扩展秘钥为例,密钥扩展分为以下四个步骤:
  1. 排列。将16字节的初始秘钥分为4列,取出最后一列,即第4个字,向左循环移动1个字节,即代码中的RotWord函数。我们称经过排移位后这一列为排列列。
  1. 置换。把排列列经过一个置换盒(即S盒),排列列就会被映射为一个崭新的列,我们称这个崭新的列为置换列。即代码中的SubWord函数。
  1. 与"轮常量"进行异或。把置换列和一个叫“轮常量”的数组进行异或,得到一个崭新的列,这一列将用来作为第二轮密钥的最后一列。Rcon[i]是轮常量,代表一个字,这个字最右边三个字节总是0,因此字与Rcon异或,其结果只是与该字最左边的那个字节相异或。每一轮的轮常量都不相同,其定义为Rcon[i] = (RC[i],0,0,0),其中RC[1] = 1,RC[i] = 2•RC[i-1]
  1. 生成下一轮密钥的其他列。第二轮密钥的最后一列和初始密钥的第一列异或就得到二轮密钥的第一列,用二轮密钥的第一列和初始密钥的第二列异或就得到二轮密钥的第二列,用二轮密钥的第二列和初始密钥第三列异或就得到二轮密钥的第三列。
这样一轮密钥就算扩展完了,依照这样的方法,我们就可以由二轮密钥扩展出三轮密钥,由三轮密钥扩展出四轮密钥,以此类推,直至扩展出后面需要的10轮密钥。

加解密过程

完成密钥扩展后,加密和解密的过程如图所示,以AES-128为例:
notion image
  1. 将分组为128位的明文数据与128位的初始密钥进行异或操作, 称为初始轮。
  1. 重复执行9次字节混淆、行移位、列混乱、加轮密钥这四个操作,该操作称为重复轮。
  1. 第10次操作称为最终轮,和重复轮的操作差不多,只是在最终轮不再进行列混乱这个操作,因为不会再有下一轮,所以没必要再进行列混乱。
上述步骤中,执行重复轮和最终轮的次数叫做加密轮数。根据秘钥的长度,加密轮数也有所不用,128位16字节的密钥重复轮推荐重复执行9次,192位密钥重复轮推荐重复执行11次,256位密钥重复轮推荐重复执行13次。如图所示:
AES
密钥长度
分组长度
加密轮数
AES-128
128位
128位
10
AES-192
192位
128位
12
AES-256
256位
128位
14
在重复轮和最终轮中,操作对象是状态矩阵,状态矩阵的定义是将明文分组用字节为单位的正方形矩阵描述。在算法的每一轮中,状态矩阵的内容不断发生变化,最后的结果作为密文输出。矩阵中字节的排列顺序为从上到下、从左至右依次排列,如图所示。
notion image
重复轮中单轮处理流程如如所示:
notion image
其中:
  1. 字节代替是指初始轮得到的状态矩阵经过一个置换S盒处理后,会输出一个新的矩阵,称为字节代替矩阵。
  1. 接下来对字节代替矩阵进行行移位,从第二行开始循环左移1次,第三行开始循环左移2次,第四行开始循环左移3次,这样得到的新矩阵称为行移位矩阵。
  1. 然后用模不可约多项式将每列混淆,得到一个新的矩阵,称为列混淆矩阵。
  1. 最后加轮密钥(AddRoundKey)。在每一轮结束的时候,把列混淆矩阵和下一轮的密钥执行一次异或操作,得到一个新的状态矩阵,称为加轮秘钥矩阵,作为下一轮的状态矩阵。
因此,AES-128需要执行重复轮9次,最后进入加密的最终轮,最终轮结束后,完成一次AES加密,我们就会得到一个明文数据对应的密文。解密过程是加密的逆过程,我们只需要把加密的每个步骤顺序颠倒执行就完成了解密过程。
密码学
  • 密码学算法
  • 对称密钥
  • 【对称秘钥】SM4【非对称秘钥】国密SM2
    目录