LV04-02-AES算法-01-AES算法基本原理

本文主要是AES算法——AES算法基本原理的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
PC端开发环境 Windows Windows11
Ubuntu Ubuntu20.04.6的64位版本
VMware® Workstation 17 Pro 17.0.0 build-20800274
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Win32DiskImager Win32DiskImager v1.0
Linux开发板环境 Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
点击查看本文参考资料
点击查看相关文件下载
------

一、AES加密算法简介

1. 简介

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),又称Rijndael加密法(荷兰语发音:[ˈrɛindaːl],音似英文的“Rhine doll”),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。

它是一种分组加密标准,每个加密块大小为128位,允许的密钥长度为128、192和256位。它是一种对称加密算法,它是目前应用最广泛的加密算法之一。AES算法具有高效性、安全性和可靠性,被广泛用于数据保护、网络通信以及安全传输等领域。

image-20240810100957523

2. AES安全性

2.1 安全性分析

  • 轮数与密钥长度

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES 密钥长度(32位比特字) 分组长度(32位比特字) 加密轮数
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

一般来说,密钥长度越长,破解难度越大,安全性越高。推荐使用256位密钥以获得最高级别的安全性。AES的安全性与轮数有关,一般128位密钥对应10轮,192位密钥对应12轮,256位密钥对应14轮。增加轮数可以增强加密算法的安全性,但也会增加计算成本。

选择AES的密钥长度时,应根据所需的安全级别和性能需求来决定:

(1)对于一般应用,128位密钥已经足够安全,而且具有较好的性能表现。

(2)如果需要更高级别的安全性,可以选择192位或256位密钥。256位密钥提供了最高级别的安全性,但会增加加密和解密的计算成本。

(3)在实际应用中,应权衡安全性和性能需求,选择合适的密钥长度。

  • S盒设计

AES的S盒(Substitution Box)经过专门设计,具有良好的非线性性和扩散性,增强了AES的安全性。S盒的设计是AES抵抗差分攻击和线性攻击的关键。

S盒是什么?S盒 - Wikiwand / articles

在密码学中,一个S盒(Substitution-box,替换盒)是对称密钥加密算法执行替换计算的基本结构。在块密码中,它们通常用于模糊密钥与密文之间的关系——香农的混淆理论。

通常,S-Box接受特定数量的输入比特m,并将其转换为特定数量的输出比特n,其中n 不一定等于m。一个m×n的S盒可以通过包含2m条目,每条目n比特的查找表实现。S盒通常是固定的(例如DES和AES加密算法), 也有一些加密算法的S盒是基于密钥动态生成的(例如Blowfish和双鱼算法加密算法)。DES的6×4位S盒(S5)是一个很好的例子:

S5 中间四个比特
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
首尾比特 00 0010 1100 0100 0001 0111 1010 1011 0110 1000 0101 0011 1111 1101 0000 1110 1001
01 1110 1011 0010 1100 0100 0111 1101 0001 0101 0000 1111 1010 0011 1001 1000 0110
10 0100 0010 0001 1011 1010 1101 0111 1000 1111 1001 1100 0101 0110 0011 0000 1110
11 1011 1000 1100 0111 0001 1110 0010 1101 0110 1111 0000 1001 1010 0100 0101 0011

给定6比特输入,将首尾两个比特作为行条件、中间四个比特(inner four bits)作为列条件进行查表,最终获得4比特输出。例如,输入“011011”,通过首尾两个比特“01”和中间的比特“1101”进行查表,最终的输出应该是“1001”。

  • 密钥调度算法

AES使用密钥调度算法生成轮密钥,确保生成的轮密钥与原始密钥无关,增加了密码的复杂性,提高了安全性。

2.2 抗攻击性能

AES具有很好的抗攻击性能,主要表现在以下几个方面:

差分攻击(Differential Cryptanalysis): AES对差分攻击有较好的抵抗能力,这种攻击方式需要大量的明文-密文对来分析密码算法的性质,而AES的S盒设计和轮函数的复杂性使得差分攻击变得更加困难。

线性攻击(Linear Cryptanalysis): AES对线性攻击也有较好的抵抗能力,线性攻击利用线性逼近的特性来破解密码算法,AES的设计使得线性攻击难以成功。

3. AES在软硬件的实现

AES可以在软件和硬件中实现,提供数据加密和解密功能。在软件中,AES通常通过调用加密库或使用加密算法实现。在硬件中,AES可以通过专用的加密芯片或FPGA实现加速加密运算。

在软件中实现AES时,可以使用各种编程语言(如C、C++、Java等)提供的加密库,或者使用开源的加密算法库(如OpenSSL、Crypto++等)来实现AES算法。

在硬件中实现AES时,可以使用专门设计的加密芯片(如TPM芯片)或者使用FPGA(现场可编程门阵列)来加速AES加密运算。硬件实现通常能提供更高的性能和安全性,适用于对加密性能要求较高的场景。

二、AES加密算法基本原理

1. 基础知识

1.1 输入和输出

AES 算法的输入和输出均为一个长度为128的比特串(值为0或1)。这些序列也可以 称为分组(blocks),其中含有的位(bits)数也称为分组长度。

AES算法的密钥是128,192或256 比特的序列。AES-FIPS197标准中不允许其它的输入、输出长度和密钥长度。 序列中比特的编号从0开始,至序列长度(分组长度或密钥长度)减1。将该比特的编号 i 称为其索引。根据分组长度和密钥长度决定其值属于下列范围中的哪一个: $0 \leq i \lt 128$, $0 \leq i \lt 192$或$0 \leq i \lt 256$。

AES加密过程涉及到4种操作,分别是字节替代、行移位、列混合和轮密钥加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。

1.2 状态(State)

AES算法的运算都是在一个称为状态的二维字节数组上进行。一个状态由四行组成, 每一行包括Nb个字节,Nb等于分组长度除以32。用s表示一个状态矩阵,每一个字节的 位置由行号r (范围是 $0 \leq 0 \lt 4$ )和列号c (范围是$0 \leq c \lt Nb$ )唯一确定,记为$s_{r,c}$或$s[r,c]$。 在AES-FIPS197标准中Nb=4,即$0 \leq c \lt 4$。

在加密和解密的初始阶段将输入字节数组$in_{0},in_{1},…,in_{15}$复制到如图所示的状态矩阵中。加密或解密的运算都在该状态矩阵上进行,最后的结果将被复制到输出 字节数组$out_{0},out_{1},…,out_{15}$​。

image-20240812074842387

在加密和解密的初始阶段,输入数组in按照下述规则复制到状态矩阵中:
$$
s[r,c]=in[r+4c] \space\space\space\space for \space 0 \leq r \lt 4 \text{ 且 } 0 \leq c \lt Nb
$$
在加密和解密的结束阶段,状态矩阵将按照下述规则被复制到输出数组out中:
$$
out[r+4c]=s[r,c] \space\space\space\space for \space 0 \leq r \lt 4 \text{ 且 } 0 \leq c \lt Nb
$$

1.3 加解密函数

设AES加密函数为E,则
$$
C = E(K, P)
$$

其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

设AES解密函数为D,则
$$
P = D(K, C)
$$
其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

2. AES算法流程

AES 128的整体结构如下图所示,其中的W[0:3]是指W[0]、W[1]、W[2]和W[3]串联组成的128位密钥。上面说到,AES的加密公式为
$$
C = E(K,P)
$$
在加密函数E中,会执行一个轮函数,并且执行10次这个轮函数,加密的第1轮到第9轮的轮函数一样,只有第10次有所不同。前9轮中,每轮包括4个操作:字节代换、行位移、列混合和轮密钥加。也就是说,一个明文分组会被加密10轮。

AES的核心就是实现一轮中的所有操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。最后一轮迭代不执行列混合。另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。

image-20240823075327904

加解密中每轮的密钥分别由初始密钥扩展得到。算法中16个字节的明文、密文和轮密钥都以一个4x4的矩阵表示。

AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。一般地,明文分组用字节为单位的正方形矩阵描述,称为状态矩阵。在算法的每一轮中,状态矩阵的内容不断发生变化,最后的结果作为密文输出。该矩阵中字节的排列顺序为从上到下、从左至右依次排列,如下图所示:

image-20240817062647468

假设明文分组P为”abcdefghijklmnop”,则对应上面生成的状态矩阵图如下(此图并未验证数据实际是否是这样,作为参考):

image-20240817063141047

类似地,128位密钥也是用字节为单位的矩阵表示,矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加,后面40个字分为10组,每组4个字(128比特)分别用于10轮加密运算中的轮密钥加,如下图所示:

image-20240817063951940

上图中,设K = “abcdefghijklmnop”,则K0 = a, K15 = p, W[0] = [K0 K1 K2 K3] = “abcd”。

3. 加密步骤分析

伪代码如下:

image-20240822074907843

3.1 字节替代(SubBytes( ))变换

字节替代(SubBytes())变换是一个非线性的字节替代,它独立地将状态中的每个字节利用替代表(S盒)进行运算。SubBytes()变换在状态上的作用效果如图6:

image-20240820073919337

该S盒(图7)是可逆的,由两个变换复合而成:

image-20240816075348961

图7为以16进制表示的SubBytes()变换对应的S盒。例如,如果$S_{1,1} ={53}$,则替代后的值将由图7中行标为5列标为3的交集决定。即$S’_{1,1} = {ed}$。

根据例子可知状态矩阵中的元素按照下面的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0xA9,则查S盒的第0x0A行和0x09列,得到值0xD3,然后替换S1原有的0xA9为0xD3。状态矩阵经字节代换后的图如下:

image-20240820075017532

3.2 行移位(ShiftRows( ))变换

行移位是一个简单的左循环移位操作。

image-20240820225731801

当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示:

image-20240820075855856

3.3 列混合(MixColumns( ))变换

image-20240820230459937

列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混合后的状态矩阵,如下图的公式所示:

image-20240820231532597

完整的公式为:

img

其中,矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法。这里涉及到一些信息安全上的数学知识,其实这种二元运算的加法等价于两个字节的异或,乘法则复杂一点。对于一个8位的二进制数来说,使用域上的乘法乘以(00000010)等价于左移1位(低位补0)后,再根据情况同(00011011)进行异或运算,设S1 = (a7 a6 a5 a4 a3 a2 a1 a0),刚0x02 * S1如下图所示:

col3

也就是说,如果a7为1,则进行异或运算,否则不进行。类似地,乘以(00000100)可以拆分成两次乘以(00000010)的运算:

col4

乘以(0000 0011)可以拆分成先分别乘以(0000 0001)和(0000 0010),再将两个乘积异或:

在这里插入图片描述

因此,我们只需要实现乘以2的函数,其他数值的乘法都可以通过组合来实现。 所以列混合运算可以写成如下公式,以其中一列为例:

image-20240821070949198

举个例子:

image-20240821071859030

3.4 轮密钥加(AddRoundKey( ))变换

轮密钥加是将128位轮密钥Ki同状态矩阵中的数据进行逐位异或操作。如下图所示。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。

image-20240821072925306

其实就是下图这个样子:

image-20240821072902597

3.5 密钥扩展

AES首先将初始密钥输入到一个4*4的状态矩阵中,如下图所示,这个4*4矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为”abcdefghijklmnop”,则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”:

image-20240821073739426

然后,对W数组扩充40个新列,构成总共44列的扩展密钥数组。新列以如下的递归方式产生:

(1)如果i不是4的倍数,那么第i列由$W[i]=W[i-4] \bigoplus W[i-1]$确定

(2)如果i是4的倍数,那么第i列由等式$W[i]=W[i-4] \bigoplus T(W[i-1]) $确定

其中,T是一个有点复杂的函数。 函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。

a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。

b.字节代换:对字循环的结果使用S盒进行字节代换。

c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。

轮常量Rcon[j]是一个字,其值见下表。

j 1 2 3 4 5
Rcon[j] 01 00 00 00 02 00 00 00 04 00 00 00 08 00 00 00 10 00 00 00
j 6 7 8 9 10
Rcon[j] 20 00 00 00 40 00 00 00 80 00 00 00 1B 00 00 00 36 00 00 00

举个例子,设初始的128位密钥为:3C A1 0B 21 57 F0 19 16 90 2E 13 80 AC C1 07 BD,那么4个初始值为:

1
2
3
4
W[0] = 3C A1 0B 21 
W[1] = 57 F0 19 16
W[2] = 90 2E 13 80
W[3] = AC C1 07 BD

下面求扩展的第1轮的子密钥($W[4],W[5],W[6],W[7]$)。由于4是4的倍数,所以: $$W[4]=W[0] \bigoplus T(W[3]) $$。$T(W[3])$的计算步骤如下:

(1)循环地将W[3]的元素移位:AC C1 07 BD变成C1 07 BD AC;

(2)将 C1 07 BD AC 作为S盒的输入,输出为78 C5 7A 91;

(3)将78 C5 7A 91与第一轮轮常量Rcon[1]进行异或运算,将得到79 C5 7A 91,因此,T(W[3])=79 C5 7A 91,故
$$
W[4] = \text{3C A1 0B 21} \bigoplus \text{79 C5 7A 91} = \text{45 64 71 B0}
$$
其余的3个子密钥段的计算如下:
$$
\begin{flalign}
&W[5] = W[1] \bigoplus W[4] = \text{57 F0 19 16} \bigoplus \text{45 64 71 B0} = \text{12 94 68 A6 } \newline
&W[6] = W[2] \bigoplus W[5] =\text{90 2E 13 80} \bigoplus \text{12 94 68 A6} = \text{82 BA 7B 26 } \newline
&W[7] = W[3] \bigoplus W[6] = \text{AC C1 07 BD} \bigoplus \text{82 BA 7B 26} = \text{2E 7B 7C 9B } \newline
\end{flalign}
$$
所以,第一轮的密钥为45 64 71 B0 12 94 68 A6 82 BA 7B 26 2E 7B 7C 9B

密钥扩展伪代码:

image-20240822075011547

4. 解密步骤分析

将加密变换逆转,然后以逆序执行即可直接得到解密 算法。解密算法伪代码:

image-20240822075049267

4.1 逆行移位(InvShiftRows( ))变换

image-20240822074321355

4.2 逆字节替代(InvSubBytes( ))变换

逆字节替代(InvSubBytes())变换是字节替代(SubBytes())变换的逆变换,在状态的 每个字节上应用S盒的逆。

image-20240822074410571

4.3 逆列混合(InvMixColumns( ))变换

逆列混合(InvMixColumns())变换是列混合(MixColumns())变换的逆变换。

image-20240822074457918

经过该乘法计算后,一列中的4个字节将由下述结果取代:

image-20240822074526335

4.4 轮密钥加(AddRoundKey())变换的逆变换

轮密钥加( AddRoundKey())变换,其逆变换就是它本身,因为其中 只应用了异或(XOR)运算。

4.5 等价的解密变换

2.AES算法流程一节中的图,所描述的直接得到的解密算法中,其各个变换的操作顺序与加密算法 不同,伪代码对比如下:

image-20240822075251313

但是加密和解密算法中的密钥编排形式相同。然而,AES算法的若干性质允许构造 一个等价的解密算法,解密时各个变换的操作顺序与加密(由逆变换取代原来的变换)相同。 这是通过改变密钥编排完成的。

允许该等价解密变换的二个关键性质如下:

(1)字节替代(SubBytes())变换和行移位(ShiftRows())变换的顺序不影响结果。即, 先进行字节替代(SubBytes())变换紧接着进行行移位(ShiftRows())变换等价于 先进行行移位(ShiftRows())变换紧接着再进行字节替代(SubBytes())变换。对于逆变换InvSubBytes()和InvShiftRows(),该性质也成立。

(2)列混合运算-MixColumns()和InvMixColumns()-是关于列输入的线性变换, 即意味着 InvMixColumns(state XOR Round Key)= InvMixColumns(state) XOR InvMixColumns(Round Key)

这些性质使得InvSubBytes()变换和InvShiftRows()变换可以交换顺序。AddRoundKey ()变换和InvMixColumns()变换的顺序也可以交换,只要将解密中密钥编排得到的密 钥列(字)应用InvMixColumns()变换进行修改即可。

等价的解密算法如图12所示,定义为将InvSubBytes()变换和InvShiftRows()变 换的顺序反转过来,同时当利用InvMixColumns()变换先修改了1到Nr-1轮的解密密钥 编排结果后,将“轮循环”中使用的AddRoundKey()变换和InvMixColumns()变换的 顺序反转。解密密钥编排结果的第一和最后Nb字将不使用该方式进行修改。

image-20240822075634528

基本流程图如下:

image-20240824064237513

三、加密模式

对于对称加密一般分为流加密(如OFB、CFB等)和块加密(如ECB、CBC等)。一般的加密通常都是块加密,对于块加密(或称分组加密),如果要加密超过块大小的数据,就需要涉及填充和链加密模式。

块加密和流加密的基本概念:

  • 块加密:或者叫分组加密, 为单位进行一次加密,将明文按一定的位长分组成块,明文块加密后得到密文组。解密雷同,密文组解密还原成明文组。
  • 流加密:或者交序列加密,以 为单位进行一次加密,利用少量的密钥通过某种复杂的密码算法进行运算产生大量的伪随机位流,用于对明文位流的加密。

1. AES填充方式

image-20240824070820815

以aes128为例,这里的每个明文块都是16字节,一共是128位。这里有一个问题,就是,明文数据最后不够16字节怎么办?比如这段数据有43个字节,我们可以分成两个16字节的明文块再加一个11字节的明文块,这最后一个少了5个字节。这时候就需要对最后的这11字节明文块进行处理,常见的填充方案有如下几种:

  • PKCS7(Padding Cryptography System 7)填充:在明文末尾添加填充字节,填充字节的值等于需要填充的字节数。

填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。假定块长度为 8,数据长度为 9,则填充用八位字节数等于 7,数据如下:

1
2
3
4
FF FF FF FF FF FF FF FF FF
这样可以分为两块:
块0 FF FF FF FF FF FF FF FF
块1 FF

PKCS7 填充后如下所示:

1
2
块0 FF FF FF FF FF FF FF FF    
块1 FF 07 07 07 07 07 07 07
  • PKCS5(Padding Cryptography System 5)填充:与PKCS7填充类似,只是该种填充方式用于8字节分组的加密算法。

  • NoPadding填充:不进行任何填充,要求明文长度必须是分组长度的整数倍。

也有一些其他的填充方式,比如全填0之类的,但一般,自己在使用的时候,没什么特殊要求的时候,最后不足16字节的不加密就可以了。

2. 加密模式

aes加密是分组加密,所以不仅涉及到填充方式,还会涉及到加密的模式,一般有五种:

  • 电码本模式(Electronic Codebook Book (ECB))

  • 密码分组链接模式(Cipher Block Chaining (CBC))

  • 计算器模式(Counter (CTR))

  • 密码反馈模式(Cipher FeedBack (CFB))

  • 输出反馈模式(Output FeedBack (OFB))

2.1 ECB 模式

ecb-mode

The Electronic Codebook (ECB) mode is a typical block cipher mode of operation using block cipher algorithm. In this version, we provide Data Encryption Standard (DES) and Advanced Encryption Standard (AES) processing ability, the cipherkey length for DES should be 64 bits, and 128/192/256 bits for AES. Another limitation is that our working mode works on units of a fixed size (64 or 128 bits for 1 block), but text in the real world has a variety of lengths. So, the last block of the text provided to this primitive must be padded to 128 bits before encryption or decryption.

ECB模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。

plaintext ciphertext cipherkey IV
ECB-DES 64 64 64 64
ECB-AES128 128 128 128 128
ECB-AES192 128 128 192 128
ECB-AES256 128 128 256 128
algorithm flow chart of ECB

优点

  • 简单,易实现,可并行缺点:

缺点

  • 分组进行加密,加密方式一致,那么可根据密文情况观察到明文情况,有被破解的风险,不安全。
  • 加密消息块相互独立成为被攻击的弱点,不能提供严格的数据保密性,可以对明文进行主动攻击。

2.2 CBC 模式

cbc-mode

The Cipher Block Chaining (CBC) mode is a typical block cipher mode of operation using block cipher algorithm. In this version, we provide Data Encryption Standard (DES) and Advanced Encryption Standard (AES) processing ability, the cipherkey length for DES should be 64 bits, and 128/192/256 bits for AES. Another limitation is that our working mode works on units of a fixed size (64 or 128 bits for 1 block), but text in the real world has a variety of lengths. So, the last block of the text provided to this primitive must be padded to 128 bits before encryption or decryption.

CBC模式由IBM发明与1976年,在CBC模式中,每个平文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有密文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。

plaintext ciphertext cipherkey IV
CBC-DES 64 64 64 64
CBC-AES128 128 128 128 128
CBC-AES192 128 128 192 128
CBC-AES256 128 128 256 128
algorithm flow chart of CBC

可以看到,这种方法的每个密文块都依赖于它前面的明文块,使加密的各段数据之间有了联系,保证了每条消息的唯一性。第一个块中需要使用始化向量IV。加密的时候,第一块后的每一块 需要先与前一个密文异或再加密 $Ci = Ek (P \bigoplus Ci-1), C0 = IV$。解密的时候,一个密文会影响到该明文与后一个明文,不会对其他明文产生影响 $Pi = Dk (Ci) \bigoplus Ci-1, C0 = IV$。

优点:

  • 无法直接从密文中看出明文信息块的规律,所以安全性比较好
  • 因密文块依赖于所有的信息块,加密时,若明文块有一个消息改变则影响所有密文块
  • 加密解密过程都需要 初始化向量(而且要相同)

缺点:

  • 因为具备依赖性,加密过程是串行的,无法被并行化,但是解密可以并行化,因为一个密文会影响到该明文与后一个明文,不会对其他明文产生影响

  • 数据必须是块大小的整数倍,不够需要填充

2.3 CTR 模式

ctr-mode

The Counter (CTR) mode is a typical block cipher mode of operation using block cipher algorithm. In this version, we provide Advanced Encryption Standard (AES) processing ability, the cipherkey length for AES should be 128/192/256 bits. Another limitation is that our working mode works on units of a fixed size (128 bits for 1 block), but text in the real world has a variety of lengths. So, the last block of the text provided to this primitive must be padded to 128 bits before encryption or decryption.

计算器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。

plaintext ciphertext cipherkey IV
CTR-AES128 128 128 128 128
CTR-AES192 128 128 192 128
CTR-AES256 128 128 256 128
algorithm flow chart of CTR

优点:

  • 允许并行计算、允许同时处理多块明文 / 密文
  • 可随机访问,算法和加密盒的输出不依靠明文和密文的输入,因此如果有足够的保证安全的存储器,加密算法将仅仅是一系列异或运算,这将极大地提高吞吐量。
  • 与CFB一样,无需填充

缺点:

2.4 CFB 模式

cfb-mode

The Cipher Feedback (CFB) mode is a typical block cipher mode of operation using block cipher algorithm. In this version, we provide Data Encryption Standard (DES) and Advanced Encryption Standard (AES) processing ability, the cipherkey length for DES should be 64 bits, and 128/192/256 bits for AES. Another limitation is that our working mode works on units of a fixed size (64 or 128 bits for 1 block), but text in the real world has a variety of lengths. So, the last block of the text provided to this primitive must be padded to 128 bits before encryption or decryption. Although, CFB1 and CFB8 modes share the same interface with CFB128 mode, the plaintext and ciphertext is processed bit-by-bit or byte-by-byte not block-by-block for CFB1 and CFB8 modes respectively.

前一个密文使用秘钥Key再加密后,与明文异或,得到密文。第一个密文需要初始向量IV加密得到。解密也同样使用加密器进行解密。

plaintext ciphertext cipherkey IV
CFB1-DES 64 64 64 64
CFB1-AES128 128 128 128 128
CFB1-AES192 128 128 192 128
CFB1-AES256 128 128 256 128
CFB8-DES 64 64 64 64
CFB8-AES128 128 128 128 128
CFB8-AES192 128 128 192 128
CFB8-AES256 128 128 256 128
CFB128-DES 64 64 64 64
CFB128-AES128 128 128 128 128
CFB128-AES192 128 128 192 128
CFB128-AES256 128 128 256 128
algorithm flow chart of CFB

说明:

  • 第一个块中都需要使用初始化向量IV

  • 加密:通过密钥key加密后与明文进行异或得到密文,后面所有的加密都依赖于前一个加密后的输出,CFB是依赖前一个密文。

  • 解密:通过密钥加密后,与密文进行异或得到明文,当前的 加密后的输出 会影响当前的明文与下一个明文,不会影响所有明文的生成,CFB是 密文会影响,而不是加密后的输出。

优点:

  • 隐藏了明文模式
  • 加密前后的数据位数是相同的
  • 可以及时加密传送小于分组的数据

缺点:

  • 与CBC类似,加密不利于并行计算,解密可以并行计算
  • 加密时一个明文单元损坏影响多个单元
  • 加密解密需要唯一的一个与块的大小相同的移位寄存器,并用初始化向量IV将寄存器初始化

2.5 OFB模式

ofb-mode

The Output Feedback (OFB) mode is a typical block cipher mode of operation using block cipher algorithm. In this version, we provide Data Encryption Standard (DES) and Advanced Encryption Standard (AES) processing ability, the cipherkey length for DES should be 64 bits, and 128/192/256 bits for AES. Another limitation is that our working mode works on units of a fixed size (64 or 128 bits for 1 block), but text in the real world has a variety of lengths. So, the last block of the text provided to this primitive must be padded to 128 bits before encryption or decryption.

首先用 块加密器 生成 密钥流(Keystream),然后再将密钥流与明文流异或得到密文流;解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文 (与CFB类似)

plaintext ciphertext cipherkey IV
OFB-DES 64 64 64 64
OFB-AES128 128 128 128 128
OFB-AES192 128 128 192 128
OFB-AES256 128 128 256 128
algorithm flow chart of OFB

参考资料:

AES加密算法原理的详细介绍与实现-CSDN博客

AES加密算法原理(加密过程) - Shawn_Michaels - 博客园 (cnblogs.com)

AES 加密算法的原理详解_aes原理-CSDN博客

深入探究AES加密算法:加密原理、模式和填充方式详解_aes填充模式-CSDN博客

密码学_AES-加密算法\ 详解_aes cfb算法-CSDN博客

高级加密标准AES的工作模式(ECB、CBC、CFB、OFB)_aes cfb-CSDN博客

高级加密标准 - Wikiwand

深入理解高级加密标准(Advanced Encryption Standard) - Amd794 - 博客园 (cnblogs.com)

AES加密 填充方式_aes 填充字符-CSDN博客

关于PKCS5Padding与PKCS7Padding的区别 - 在路上… - 博客园 (cnblogs.com)

分组对称加密模式:ECB/CBC/CFB/OFB缺CTR - Ady Lee - 博客园 (cnblogs.com)

AES五种加密模式(CBC、ECB、CTR、OCF、CFB) - 月之星狼 - 博客园 (cnblogs.com)

加密模式介绍(ECB、CBC、PCBC、CFB、OFB、CTR)-CSDN博客