图解AES密钥扩展与加密过程
在嵌入式软件开发中,特别是涉及到与云端进行数据传输时,为确保数据的安全性,需要对数据进行加密,本篇了就来介绍常用的一种加密方式——AES加密的原理。
1 AES加密简介
AES(Advanced Encryption Standard,高级加密标准)是一种广泛使用的对称加密算法,由美国国家标准与技术研究院(NIST)于 2001 年标准化,用于替代安全性不足的 DES 算法。
AES 的核心特性
- 对称加密:加密和解密使用相同的密钥,密钥长度可选择 128 位、192 位或 256 位(分别称为 AES-128、AES-192、AES-256),密钥越长,安全性越高,但计算开销也略大
- 分组加密:处理固定长度的明文块(128 位,即 16 字节),若明文长度不足 16 字节,需通过填充(如 PKCS#7)补足;若超过 16 字节,则分块处理并结合模式(如 CBC、GCM 等)保证安全性
- AES 的加密过程是对 16 字节明文块(按 4×4 矩阵排列,称为 “状态矩阵”)进行多轮变换,轮数取决于密钥长度:
- AES-128:10 轮
- AES-192:12 轮
- AES-256:14 轮
本篇介绍最基础的128 位密钥,10轮加密,并且明文长度为16 字节不需要填充的情况。
例如:“coder-love-study”字符串刚好16个字符,只需要对这一个数据块进行加密即可。
在执行加密前,需要先将字符串转为对应的16进制数,也就是通过ASCII码表进行转换。
另外,需要注意是的,16个字节的数据块,要按列优先的顺序,排列到4x4的矩阵中,如下图:
这里再附一份ASCII码对照表:
AES-128的密钥,刚好也是4x4的矩形(种子密钥),而进行10轮加密,使用的密钥是不同的,这些密钥都是从种子密钥扩展出来的。
下面就开始介绍AES的密钥扩展和具体加密过程
2 轮密钥的计算
AES 的原始密钥(种子密钥)通过特定算法扩展为多轮子密钥(如 AES-128 需扩展为 11 个子密钥,包含初始密钥和 10 轮密钥)。
扩展过程是按列进行扩展,其计算过程主要分为两大类:
- 列索引是4的倍数:计算过程稍复杂
- 列索引不是4的倍数:计算过程稍简单
2.1 S-Box表与轮常量表
在介绍密钥扩展的具体步骤之前,先了解一下要用到的一些表
2.1.1 S-box表
是一个固定的表格,16行x16列,用于数据映射,后面字节代换时会用到
2.1.2 轮常量表
也是一个固定的表格,一共有10列,后面计算4的倍数列的密钥时会用到,10个扩展密钥分别会使用对应的列。
2.2 计算4的倍数列
先来介绍4的倍数列的扩展密钥如何结算,例如第4列(轮密钥1的最左侧的列),计算过程为:
- 通过i-1列(第3列)进行数据变换,包括:
- 字节旋转:就是把第3列的数据先取出来,然后循环移动1位
- S-box查表:每个数据,看作是行、列左边,去S-box中找到对应的位置,取出其存储的值,作为替换值
- 与轮常量进行异或运算
- i-4列的值(第0列)与i-1列变换后的值,进行异或运算
如上图的计算过程,最终计算得到第4列的密钥为:9C A5 3F AA
S-box的映射过程举例:
异或的计算过程:
2.3 计算非4的倍数列
再来看不是4的倍数列的扩展密钥如何结算,例如第5列(轮密钥2的第2列),计算过程为:
- i-4列的值(第1列)与i-1(第4列),进行异或运算即可
2.4 最终结果
按照上述方式,通过种子密钥,依次计算出扩展密钥的第443列,也就得到了轮密钥1轮密钥10,后面在多轮加密时,会分别用到对应轮的密钥。
3 加密过程解析
AES-128有10轮加密,其过程可以归类为:
- 初始变换
- 执行轮密钥加(种子密钥加)
- 9轮循环运算,每一轮的步骤相同,密钥不同
- 字节代换
- 行移位
- 列混淆
- 轮密钥加
- 1轮最终轮
- 字节代换
- 行移位
- 轮密钥加
3.1 初始变换
初始变换其实就是执行轮密钥加,准确的说是种子密钥加,因为初始变换使用的是种子密钥。
具体的变换过程,就是数据矩阵和种子密钥矩阵的对应位置的数据进行异或操作。
初始变换举例
3.2 9轮循环运算
9轮循环中,每轮循环依次执行如下步骤:
- 字节代换
- 行移位
- 列混淆
- 轮密钥加(依次使用密钥是前面计算出的轮密钥1~轮密钥9)
3.2.1 字节代换与行移位
字节代换,其实就是S-box表映射,前面在计算扩展密钥时就使用过,这里就是要对4x4矩阵中的每一个数据都进行S-box的映射替换。
行移位,其过程可理解为:
- 第1行数据不动
- 第2行左移1位,然后左边多出的1位数据再移动到右边
- 第3行左移2位,然后左边多出的2位数据再移动到右边
- 第4行左移3位,然后左边多出的3位数据再移动到右边
具体过程可参考下图:
3.2.2 列混淆
列混淆,是对4x4的数据再左乘一个列混淆的固定矩形。
列混淆的过程,和矩阵乘积运算是类似的,都是行列的数据先相乘再相加,不同点是:
- 相乘的运算,是有限域(2的8次方内)的相乘
- 相加的运算,替换为二进制的异或运算
有限域的相乘运算的具体过程如下:
- 先转换为2进制进行计算
- AES的列混淆,与加密数据相乘的数据只有1、2、3这3种情况
- 与1相乘,不变
- 与2相乘,如果数据最高位是0,乘2就是左移一位,仍在有限域内;如果最高位是1,左移1位后会溢出,需要再与0x1B(AES中规定的不可约多项式的16进制表示)异或
- 与3相乘,先将3拆为1与2的异或,最终转换为先与2相乘,再与自身异或
示例,这里对矩阵的第1行第1列,和第4行第2列进行手动计算,分别得到了AF和AB
3.2.3 轮密钥加
在前面的初始变换中已解释过了轮密钥加,区别是:
- 初始变换中,使用的种子密钥
- 9轮循环中,使用的对应轮的轮密钥
轮密钥加的过程,是数据矩阵和密钥矩阵进行异或的过程
3.3 最终轮
最终轮中,执行如下步骤:
- 字节代换
- 行移位
- 轮密钥加(使用轮密钥10)
注意最终轮和前面9轮的区别是,没有了列混淆的步骤。
因此,“coder-love-study”数据,使用自定义的密钥,进行AES的10轮加密后,最终加密的就是上图的结果。
4 总结
本篇介绍了AES加密的原理,通过一个具体的字符串和自定义密钥,演示了AES加密的全过程,包括密钥的扩展过程,每轮加密的数据变换过程等,最终得到加密的结果。