AES对称加密算法

介绍

高级加密标准(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]

轮密钥加的逆运算同正向的轮密钥加运算完全一致,这是因为异或的逆操作是其自身

参考