加密模式与填充模式
第三节:加密模式与填充模式
目录
分组密码和流密码
分组密码是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组。一个分组的比特数就称为分组长度。
流密码是对数据流进行连续处理的一类密码算法。流密码一般以1比特、8比特或32比特等为单位进行加密和解密。
分组密码算法只能加密固定长度的分组,但需要加密的明文长度可能会超过分组密码的分组长度,这就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。
迭代的方法就被称为分组密码的模式。
不论是对称加密还是非对称加密, 分组密码的模式主要有以下几种:
- ECB(电子密码本模式)
- CBC(密码分组链接模式)
- CFB(密文反馈模式)
- OFB(输出反馈模式)
- CTR(计数模式)
明文分组是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。
密文分组是指使用分组密码算法将明文分组加密之后所生成的密文。
加密模式
加密模式-ECB
Electronic codebook, 电子密码本。
这种模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,
然后每组都用相同的密钥进行独立加密。
ECB的解密同理。不再阐述。
优点
不同明文分组的加密可以并行计算,速度很快。
缺点
电子编码薄模式用一个密钥加密消息的所有块,如果原消息中重复明文块,则加密消息中的相应密文块也会重复,因此,电子编码薄模式适于加密小消息。
因此安全性低,易攻击。
应用
- 用于随机数的加密保护。
- 用于单分组明文的加密。
ABCTF aes-mess-75
We encrypted a flag with AES-ECB encryption using a secret key,
and got the hash: e220eb994c8fc16388dbd60a969d4953f042fc0bce25dbef573cf522636a1ba3fafa1a7c21ff824a5824c5dc4a376e75
However, we lost our plaintext flag and also lost our key
and we can't seem to decrypt the hash back :(.
Luckily we encrypted a bunch of other flags with the same key.
Can you recover the lost flag using this?
[HINT] There has to be some way to work backwards, right?
可以看出,这个加密是一个 ECB 加密,然后 AES 是 16 个字节一组,每个字节可以使用两个 16 进制字符表示,
因此,我们每 32 个字符一组进行分组,然后去对应的 txt 文件中搜索即可。
对应 flag:
e220eb994c8fc16388dbd60a969d4953 abctf{looks_like
f042fc0bce25dbef573cf522636a1ba3 _you_can_break_a
fafa1a7c21ff824a5824c5dc4a376e75 es}
最后一个显然在加密时进行了 padding。
加密模式-CBC
Cipher-block chaining, 密码分组链接。CBC模式的密文分组像链条一样相互连接在一起。
每个明文块先与前一个密文块进行异或后,再进行加密。
在这种方法中,每个密文块都依赖于它前面的所有明文块。
跟ECB方式不一样,通过连接关系,使得密文跟明文不再是一一对应的关系,破解起来更困难,而且克服了只要简单调换密文块可能达到目的的攻击。
使用CBC模式时, 在初始化Cipher对象时, 需要增加参数,
初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());
- IV 不要求保密
- IV 必须是不可预测的,而且要保证完整性。
优点
- 密文块不仅和当前密文块相关,而且和前一个密文块或 IV 相关,隐藏了明文的统计特性。
- 具有有限的两步错误传播特性,即密文块中的一位变化只会影响当前密文块和下一密文块。
- 具有自同步特性,即第 k 块起密文正确,则第 k+1 块就能正常解密。
- 同样的原文生成的密文不一样
缺点
加密不能并行,解密可以并行。
CBC应用
- 常见的数据加密和 TLS 加密。
- 完整性认证和身份认证。
攻击
- 字节反转攻击
- Padding Oracle Attack
加密模式-CFB
CFB 全称为密文反馈模式(Cipher feedback)。
面向字符的应用程序的加密要使用流加密法,可以使用加密反馈模式。
在此模式下,数据用更小的单元加密,如可以是8位,这个长度小于定义的块长(通常是64位)。
其加密步骤是:
- 使用64位的初始化向量。初始化向量放在移位寄存器中,在第一步 加密,产生相应的64位初始化密文;
- 始化向量最左边的8位与明文前8位进行异或运算,产生密文第一部分(假设为c),然后将c传输到接收方;
- 向量的位(即初始化向量所在的移位寄存器内容)左移8位,使移位寄存器最右边的8位为不可预测的数据,在其中填入c的内容;
- 第1-3步,直到加密所有的明文单元。
解密过程相反。
优点
- 适应于不同数据格式的要求
- 有限错误传播
- 自同步
缺点
加密不能并行化,解密不能并行
应用
该模式适应于数据库加密,无线通信加密等对数据格式有特殊要求的加密环境。
加密模式-OFB
OFB 全称为输出反馈模式(Output feedback),其反馈内容是分组加密后的内容而不是密文。
输出反馈模式与CFB相似,惟一差别是,CFB中密文填入加密过程下一阶段,而在OFB中,初始化向量加密过程的输入填入加密过程下一阶段。
优点
不具有错误传播特性。
缺点
- IV 无需保密,但是对每个消息必须选择不同的 IV。
- 不具有自同步能力。
应用
适用于一些明文冗余度比较大的场景,如图像加密和语音加密。
加密模式-CTR
特点:
- 并行性: 由于每个块都被视为一个计数器的值,不需要保持块之间的状态,因此CTR模式具有良好的并行性。
- 计数器: 每个块都使用一个唯一的计数器值,避免了相同的明文块生成相同的密文块。
加密过程:
- 生成一个初始计数器值(Counter)和初始化向量(IV)。
- 将计数器值与IV组合作为输入,使用AES加密算法生成伪随机流。
- 将伪随机流与明文块进行异或运算,得到密文块。
- 更新计数器值,继续生成伪随机流,重复以上步骤直到加密完所有的块。
填充模式
填充模式-NoPadding
- 不填充.
- 在DES加密算法下, 要求原文长度必须是8byte的整数倍
- 在AES加密算法下, 要求原文长度必须是16byte的整数倍
填充模式-PKCS5Padding
数据块的大小为8位, 不够就补足。
默认方式
默认情况下, 加密模式和填充模式为 : ECB/PKCS5Padding