密码编码学之AES及其工作模式详解

一、AES

AES是对称密码,高级加密标准。wiki

0. 总体结构

在这里插入图片描述

1. Feistel密码结构

子密钥产生算法:子密钥产生越复杂,密码分析越困难;
迭代轮数:单轮不能提供安全性,多轮加密可取得很高的安全性;
密钥长度:密钥越长越安全,但会降低加解密速度;
轮函数:越复杂,抗攻击的能力强
分组长度:64位比较合理,AES采用128位

2. AES概述

明文分组为128位即16字节;
密钥长度可以为16字节、24字节或者32字节;
根据密钥长度,算法有AES128、AES192、AES256;
加密和解密算法的输入是128位分组,分组被描述为4x4的字节方阵,密钥也被描述为4x4字节方阵;

密码由N轮组成,其中轮数依赖于密钥长度:

字节长度轮数
16字节10轮
24字节12轮
32字节14轮
前N-1轮由4个不同变换组成:字节替换、行移位、列混淆和轮密钥加,最后一轮仅包含三个变换:字节替换、行移位、轮密钥加;第一轮有个初始变换(轮密钥加)。

输入一个或者多个4x4矩阵,输出4x4矩阵,最后为密文。

3. 工作模式

工作模式本质上是一项增加密码算法或使算法适应具体应用的技术。

工作模式说明
电码本(ECB)用相同的密钥分别对明文分组独立加密
密文分组链接(CBC)加密算法的输入是一个密文组和下一个明文组的异或
密文反馈(CFB)一次处理S位,上一块密文作为加密算法的输入,产生的伪随机数与明文异或 作为下一单元密文
输出反馈(OFB)与CFB类似,只是加密算法的输入是上一次加密的输出,且使用整个分组
计数器(CTR)每个明文分组都与一个经过加密的计数器相异或,对每个后续分组计数器递增

3.1 电码本(ECB)

一次处理一组明文分块,每次使用相同的密钥加密。ECB特别适用于数据量少的场景,比如加密密钥,比如传输一个AES密钥,选择此模式就比较适合。

缺点:对于很长的消息,ECB模型可能不安全,容易被攻击,比如已知一些规律性特征。

下面是电码本ECB的模式的加解密示意图:
在这里插入图片描述

3.2 密文分组链接(CBC)

为了克服ECB的弱点,需要将重复的明文分组 加密成不同的密文分组。
加密算法的输入 是当前的明文分组和上一个密文分组的异或,而使用的密钥是相同的。

下面是密文分组链接CBC的加解密示意图:
在这里插入图片描述
解密:每个密文组分别进行解密,再与上一块密文异或,就可以恢复明文。

关于IV:
IV是初始向量,在第一个明文块和IV异或后加密,以产生第一个明文分组。解密时需要将第一块密文解密后的结果 和IV异或,进而恢复第一块明文。
IV需要被保护,必须为收发双方共享,且不能被第三方预测到。为了安全,IV需要被授权才能修改,可以对IV等用ECB加密后发送。
在OPTEE的安全存储中就使用到了IV等场景,IV是使用随机数发生器 产生一个随机数分组。

3.3 密文反馈(CFB)

有些场景需要使用到流密码,流密码不像前面的两种 需要将明文填充到分组长度的整数倍,且可以实时操作。所以,需要发送的字节流数据,可以使用流密码加密后立即发送。

流密码特性:密文和明文长度相等。发送8位的字符,加密也是用8位的。

加密:
输入是b位的移位寄存器,它的值为初始向量IV;
加密函数输出最左边的s位,与明文的第一分段P1异或,得到密文的第一个单元C1;
然后将C1发送出去,接着移位寄存器左移s位,将C1填入移位寄存器的最右边s位。
就这样一直操作,直到所有明文被加密完成。

解密:
将收到的密文单元,与加密函数的输出异或得到明文单元。注意这里是使用的加密函数而不是解密函数。

应用场景:面向分组的通用传输、认证。
弱点:不能并行实现。

下面是CFB的加解密示意图:
在这里插入图片描述

3.4 输出反馈(OFB)

输出反馈模式(Output Feedback, OFB)的结构和CFB非常相似,是用加密函数的输出填充移位寄存器,而CFB是使用的密文单元来填充的移位寄存器,有点不同。

另一个不同点是,OFB是对整个明文和密文分组进行运算,而不是仅对s位的子集进行运算。
IV必须是一个时变值,即IV对每次加密运算都是唯一的,不然容易被攻击。

下面是OFB的加解密示意图:
在这里插入图片描述

3.5 计数器(CTR)

计数器模式(CTR)在ATM(异步传输模式)等应用比较广。
计数器使用与明文分组规模相同的长度。

要求:加密不同的明文组的计数器对应的值必须是不同的。
加密:计数器加密后,与明文分组异或,得到密文,没有链接。
解密:使用具有相同的计数器序列,用加密后的计数器的值 与密文分组异或 恢复明文。

优点:可并行处理,支持随机访问,效率高。

在这里插入图片描述

4. 填充模式

分组密码算法中需要将明文按指定大小进行分组,由于明文并非指定大小的整数倍,
因此在明文的最后一个分组需要将其填充至加密算法所要求的分组大小后进行加密。

常见的填充模式有:

NoPadding
PKCS5Padding
PKCS7Padding
ISO10126Padding
ISO7816-4Padding
ZeroBytePadding
X923Padding
PKCS1Padding

ANSIX923
在 ANSI X9.23 中,总是添加 1 到 8 个字节作为填充。 该块用随机字节填充(尽管许多实现使用 00)并且块的最后一个字节设置为添加的字节数。
示例:在下面的示例中,块大小为 8 个字节,4 个字节需要填充(十六进制格式)
| DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |

ISO 10126
ISO 10126 规定填充应该在最后一个块的末尾用随机字节完成,填充边界应该由最后一个字节指定。

示例:在以下示例中,块大小为 8 个字节,4 个字节需要填充。
… | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |

PKCS#5 and PKCS#7
填充以整个字节为单位。 每个添加字节的值是添加的字节数,即 N 个字节,每个值 N 被添加。 添加的字节数将取决于消息需要扩展到的块边界。

示例:在以下示例中,块大小为 8 个字节,4 个字节需要填充。
… | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |

ISO/IEC 7816-4
ISO/IEC 7816-4:2005[9] 与位填充方案相同,应用于 N 字节的纯文本。 这意味着在实践中,第一个字节是一个强制字节,值为“80”(十六进制),如果需要,接着是 0 到 N-1 个设置为“00”的字节,直到到达块的末尾。

示例:在以下示例中,块大小为 8 个字节,4 个字节需要填充。
… | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |

下一个示例显示仅一个字节的填充。
… | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD 80 |

Zero padding
需要填充的所有字节都用零填充。
示例:在以下示例中,块大小为 8 个字节,4 个字节需要填充。
… | DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |

为方便与大家及时交流,弄了一个微信公众号,欢迎大家留言沟通~
在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值