AES加密
背景
全称Advanced Encryption Standard,即高级加密标准。又称Rijndael加密法。是一个用来替换DES的加密算法,在全世界已经广泛使用,官方文档。
算法简述
AES算法支持的秘钥长度和明文块位128~256位(32位为步长),常用的组合是128位明文块和128位密文;128位明文块和256位密文。(严格地说,AES和Rijndael加密法并不完全一样,因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度均可以是128,192或256比特。)
AES密码使用了替换与置换思想,秘钥和明文块的长度决定了需要运行的轮数,最少是10轮,即秘钥和明文块都是128位。算法分为以下两个步骤
- 一次性初始化操作
- 轮次操作
本文以128位秘钥和128位明文块为标准介绍
一次性初始化操作
扩展秘钥
输入的秘钥长度为16字节,需要扩展到11个4*4的矩阵中。也就是说将16字节秘钥扩展为176字节。
秘钥扩展可以表示为下图
扩展出来的第一个矩阵就是输入矩阵,将输入矩阵每4字节记为一个字。以K0=a,k1=b,k2=c,k3=d为例,w0=abcd,依次类推。接着记w0,w1,w2,w3位w数组。用w数组扩展出剩余40个w。剩余40个w分别记为w4,w5,…,w43。其中每个wi都和w(i-1)以及w(i-4)有关,基本规则如下:
若i不是4的倍数,则wi = W(i-1) XOR w(i-4)。若i是4的倍数,wi = T(w(i-1)) XOR w(i-4).函数T流程如下图:
T函数分为3部分:旋转,代换,常量异或:
- 旋转:将一个字中的四个字节循环左移1字节,如abcd变为bcda
- 代换:使用s盒代换,把每个字节的高四位作为行值,第四位作为列值在S盒寻找输出,S盒如下
- 常量异或:有10个常量,每轮取一个进行异或,这几个常量如下:
轮数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
常量值 | 01 | 02 | 04 | 08 | 10 | 20 | 40 | 80 | 1B | 36 |
简单示例
假设初始秘钥分别为:00 01 02 ... 0F,则
w0 = 00 01 02 03
w1 = 04 05 06 07
w2 = 08 09 0A 0B
w3 = 0C 0D 0E 0F
为了计算w4,先计算T(w3):
旋转得:0D 0E 0F 0C
S盒替换得:D7 AB 76 FE
常量异或得:D6 AB 76 FE
将T函数输出再与w0异或得
w4 = D6 AA 72 FD
w5 = w4 XOR w1
w6 = w5 XOR w2
w7 = w6 XOR w3
明文初始化
由于明文块也是128位,即16字节,左移也将这16个字节写位4*4的矩阵,列优先。之后与第一个秘钥对应字节进行异或运算。
轮次运算
每一轮依次有以下几步
s盒替换
就是将输入的矩阵每个元素进行s盒替换
旋转
将矩阵第i行循环左移i个字节,如下列
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
旋转后
1 5 9 13
6 10 14 2
11 15 3 7
16 4 8 12
混合列操作
将上一步的结果与常量矩阵相乘,运算规则如下
有常量矩阵
2 3 1 1
A = 1 2 3 1
1 1 2 3
3 1 1 2
有输入矩阵
b1 b5 b9 b13
b = b2 b6 b10 b14
b3 b7 b11 b15
b4 b8 b12 b16
则A*b结果的第一列如下
c1 = (b1*2)XOR(b2*3)XOR(b3*1)XOR(b4*1)
c1 = (b1*1)XOR(b2*2)XOR(b3*3)XOR(b4*1)
c1 = (b1*1)XOR(b2*1)XOR(b3*2)XOR(b4*3)
c1 = (b1*3)XOR(b2*1)XOR(b3*1)XOR(b4*2)
实际上数学中的矩阵相乘类似,只不过相加改为了异或
结果还是一个4*4矩阵
秘钥异或
将上步输出的矩阵与该轮对应的秘钥进行异或运算
总体流程如下(注意最后一轮没有列混合运算)
解密流程也如上图所示,就是反过来,其中s盒的逆如下
解密的逆列混淆用的是如下常数矩阵去乘以密文矩阵:
0E 0B 0D 09
09 0E 0B 0D
0D 09 0E 0B
0B 0D 09 0E
题图来自unsplash:https://unsplash.com/photos/ARVFsI-32Uk