介绍
高级加密标准(AES,Advanced Encryption Standard)
是一种对称加密算法;对称加密是指,加密、解密使用的同是一串密钥,只有一个密钥作为私钥 ;而非对称加密是加密、解密使用不同的密钥,公开的叫公钥,隐藏的叫私钥; 假设两方要加密通信数据,双方都知道对方的公钥,一方用对方的公钥加密,另一方用自己的私钥就可以解密
操作:
设C为密文,AES加密函数为E,K为密钥,P为明文,则 C = E(K, P)
设AES解密函数为D,则 P = D(K, C)
AES加密算的4种操作:
- 字节替代(SubBytes)
- 行移位(ShiftRows)
- 列混淆(MixColumns)
- 轮密钥加(AddRoundKey)
AES加密不是一次成功,而是经过很多轮运算得到的
AES的Key有三种长度:AES128,AES192,AES256
除去初始轮,对应的轮数如下
AES128 | AES192 | AES256 |
---|---|---|
10 | 12 | 14 |
初始轮只有一个步骤:加轮密钥
普通轮有四个步骤:字节代替、行移位、列混淆、加轮密钥
最终轮有三个步骤:字节代替、行移位、加轮密钥
这里以128位为例
流程图
步骤
从流程图看得出,正向操作就是加密,反向逆操作就是解密
字节替代
AES定义了一个S盒和一个逆S盒,字节代换就是一个查表操作
S盒
替换过程
16字节的明文块在每一个处理步骤中都被排列成4X4的二维数组
比如S1为0x12,则查S盒的第0x01行和0x02列,查表值为0xc9,替换
S逆盒
行移位
第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节
行位移逆运算就是方向向右,步长不变
列混淆
列混淆通过矩阵相乘实现 :将矩阵b右乘列混淆矩阵
比如列混淆如上图,中间是混淆矩阵,右边是输入,左边是输出矩阵
这里的乘法不一样,第一行与第一列分别相乘,异或相加
02·S0,0 03·S0,1 01·S0,2 01·S0,3
对应二进制乘法,假设结果为a b c d
那么输出第一行第一个为 a xor b xor c xor d
依次得到第一行第二列异或和对应输出第一行第二个
···
第四行第四列异或和对应输出第四行第四个
逆变换矩阵同正变换矩阵的乘积恰好为单位矩阵
轮密钥加
将128位密钥K排成4X4的矩阵 ,那一格就有128/16=8位
a0,0 与 k0,0异或得到输出, 让输入数组的每一个字节a[i,j]与密钥对应位置的字节k[i,j]异或一次,就生成了输出值b[i,j]
轮密钥加的逆运算同正向的轮密钥加运算完全一致,这是因为异或的逆操作是其自身