信息安全4——AES加密算法

①算法简介

AES(Advanced Encryption Standard)算法即高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。在微信小程序的数据传输过程中用到的加密算法。AES算法是用来替代原先的DES,目前已经被全世界广泛使用,同时AES已经成为对称密钥加密中最流行的算法之一。AES支持三种长度的密钥:128位,192位,256位。根据密钥长度的不同,可以将AES分为AES128,AES192,AES256三种。这里我们主要对AES128进行具体讲解

②状态矩阵

在AES算法中,以字节为处理单位,128长度的分组可以分为16个字节(每个字节8位),将这16个字节从左到右从上到下依次排列构成一个4*4的矩阵,这个矩阵称为状态矩阵,如图2.1(a)是以明文abcdefghijklmnop为例构成的一个明文矩阵,(b)是与之对应的用十六进制数表示的状态矩阵。输入的明文分组可以构成一个明文初始状态矩阵。同样的密钥也构成一个状态矩阵,并通过密钥扩展函数将其扩展为44个字节组成的序列由W0-W44表示,其中W0-W3是初始密钥,后面的40个字节分为10组分别用于轮函数中的轮密钥加。

(a) 

 (b)

图 2.1

③算法流程

AES算法原理流程图如图3.1所示,明文首先和原始密钥进行依次异或运算,然后经过轮函数加密之后形成密文,其中前九次的轮函数所做的操作都是一样的(字节代换、行移位、列混合、轮密钥加),而第十次的轮函数和前九次不同(字节代换、行移位、轮密钥加)

图 3.1

③ 流程详解

(1)字节代换

简单的来说就是一个查表的过程,在加密时将状态矩阵中的一个输出字节的高四位作为行号,低四位作为列号,用S盒中对应行列位置的元素进行替换,如图3.2所示是一个S盒,图3.3所示是对上文中明文的状态矩阵进行字节代换之后得到的结果

 图 3.2

 图 3.3

(2)行移位

行移位就是将状态矩阵的第i行循环左移i位,如图3.4所示就是将经字节替换后的状态矩阵进行行移位之后的结果,第0行左移0位,第一行左移1位,第二行左移2位,第三行左移3位

 图 3.4

(3)列混合

将状态矩阵进行左乘一个给定矩阵的操作,如图3.5所示,是将行移位之后的矩阵进行列混合运算之后的结果,在列混合中的乘法和普通的乘法不相同,其规则如图3.6所示

 图 3.5

 图 3.6

(4)轮密钥加

轮密钥加是将状态矩阵中的数据以列为单位与每一轮的密钥进行异或运算,例如在第一轮中的轮密钥加密钥为W4,W5,W6,W7,明文的状态矩阵的第一列与W4进行异或运算,如图3.7所示是以上文中的明文进行轮密钥加后的结果

 

 图 3.7

④密钥扩展函数

假设在算法开始时给定的密钥为abcdefghijklmnop,对其进行扩展就是进行如图4.1所示的步骤,最终会形成10组子密钥

图 4.1

轮常量表如图4.2所示 

 图 4.2

以上就是AES算法的加密过程

参考资料:

B站上AES算法的一个比较详细的讲解视频,大家可以参考

相关文章链接

### AES-256 密钥扩展算法实现过程 AES-256 是一种基于对称加密的标准,其核心之一是密钥扩展算法(Key Expansion Algorithm),用于生成一系列轮密钥(Round Keys)。这些轮密钥在加密和解密过程中被逐轮应用。 #### 密钥扩展基本原理 AES密钥扩展算法通过输入初始密钥来生成一组更长的字节序列,该序列会被分割成多个子密钥供每一轮加密操作使用。对于 AES-256,由于密钥长度为 256 位(即 32 字节),因此需要生成更多的轮密钥以适应更高的安全需求[^1]。 #### 密钥扩展的具体步骤 以下是 AES-256 中密钥扩展的主要流程: 1. **初始化主密钥** 将原始密钥表示为一个数组 `key[0..Nk-1]`,其中 Nk 表示主密钥中的列数。对于 AES-256,Nk=8(因为 256/32=8 列)。 2. **定义常量 Rcon[i]** 每次迭代时会引入一个新的常量值 Rcon[i] 来增加复杂度并防止模式化攻击。Rcon 数组是一个预定义的表,在每次循环中更新一次特定位置上的值[^2]。 3. **执行 Core 函数变换** 对于每一新产生的临时向量 t[] 应用如下转换: - 循环左移一位 (RotWord)。 - 替代字节(SubBytes),利用 S-box 查找替换每个字节。 - XOR 结果与当前回合对应的 rcon 值。 4. **计算后续轮密钥** 使用前一阶段的结果以及刚刚处理过的数据块继续构建新的轮密钥直到满足所需总数为止。具体来说就是不断重复上述逻辑直至获得足够的材料支持整个运算周期内的所有必要组件。 5. **最终输出完整的轮密钥集合** 所有生成出来的中间产物共同构成了实际使用的各个阶段所需的参数配置情况说明文档。 下面展示了一个简单的 Python 版本实现代码片段作为参考: ```python def aes_key_expansion_256(key): Nb = 4 # Number of columns in the state (fixed at 4 for AES) Nk = 8 # For AES-256, key length is 256 bits or 8 words Nr = 14 # Number of rounds for AES-256 w = [None]*(Nb*(Nr+1)) # Array to hold all round keys temp = [] # Copy initial key into first Nk entries of expanded key array for i in range(Nk): w[i] = int.from_bytes(key[(i*4):(i*4)+4], 'big') for i in range(Nk, Nb * (Nr + 1)): temp = list(w[i-Nk].to_bytes(4,'big')) if i % Nk == 0: sub_word(rot_word(temp)) temp ^= rcon[i//Nk] elif Nk > 6 and i % Nk == 4: sub_word(temp) w[i] = w[i-Nb]^int.from_bytes(bytes(temp), 'big') return w ``` 此函数接受一个 32 字节长的二进制字符串形式的主密钥,并返回扩展后的全部轮密钥列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值