所谓块加密就是每次加密一块明文, 块加密也是对称加密, 常见的加密算法有
- IDEA 加密
- DES 加密
- AES 加密
Advanced Encryption Standard (AES), 高级加密标准, 是典型的块加密, 被设计来取代 DES, 由 Joan Daemen 和 Vincent Rijmen 所设计。
块密码的分组模式
分组加密会将明文消息划分为固定大小的块, 每块明文在密钥的控制下分别加密为密文。然而, 并非所有消息的长度都是密码块大小的整数倍, 因此通常需要对最后一块进行填充。块密码的分组模式 (Mode of Operation) 定义了如何使用同一个块密码密钥对超过单块的数据进行加密, 并保证数据的安全性。通过将变长数据划分为若干密码块, 并对最后一块使用适当的填充方式, 使其符合密码块的大小要求, 从而实现对更长数据的加密。
分组模式描述了加密每一数据块的过程, 通常借助一个附加输入值初始化向量 (IV) 进行随机化, 以提高安全性。
分组模式
ECB
ECB
(Electronic Codebook Mode, 电子密码本模式) 每块独立加密, 易受模式分析攻击
加密
解密
优点
- 实现简单
- 不同明文分组的加密可以并行计算, 速度很快
缺点
- 同样的明文块会被加密成相同的密文块, 不会隐藏明文分组的统计规律
CBC
CBC
(Cipher Block Chaining Mode, 密码块链接模式) 每块明文需与前一块密文异或后再加密, 需初始化向量 (IV)
- IV 不要求保密
- IV 必须是不可预测的, 而且要保证完整性
加密
解密
优点
- 密文块不仅和当前密文块相关, 而且和前一个密文块或 IV 相关, 隐藏了明文的统计特性
- 具有有限的两步错误传播特性, 即密文块中的一位变化只会影响当前密文块和下一密文块
- 具有自同步特性, 即第 k 块起密文正确, 则第 k+1 块就能正常解密
缺点
- 加密不能并行, 解密可以并行
OFB
OFB
(Output feedback, 输出反馈模式) 这些模式不需要填充, 适合流式数据
加密
解密
优点
- 不具有错误传播特性
缺点
- IV 无需保密, 但是对每个消息必须选择不同的 IV
- 不具有自同步能力
CFB
CFB
(Cipher feedback, 密码反馈模式) 这些模式不需要填充, 适合流式数据
加密
解密
优点
- 适应于不同数据格式的要求
- 有限错误传播
- 自同步
缺点
- 加密不能并行化, 解密不能并行
CTR
CTR
(Counter mode, 计数器模式) 这些模式不需要填充, 适合流式数据
加密
解密
优点
- CTR 模式比 OFB 模式有一些优势。一个优点是它允许并行加密和解密多个块, 因为可以为每个块独立计算密钥流。这可以提高加密和解密过程的性能和效率
特性 | 描述 |
---|---|
加密可并行化 (Encryption parallelizable) | 是 (Yes) |
解密可并行化 (Decryption parallelizable) | 是 (Yes) |
随机读取访问 (Random read access) | 是 (Yes) |
XTS
XTS
(XEX-based Tweaked Codebook Mode with Ciphertext Stealing (XEX, Xor-Encrypt-Xor), 扩展磁盘模式) XTS 主要用于磁盘加密和存储设备加密, 其设计目标是高效、安全地加密大规模数据, 同时满足存储系统的特殊需求, 如支持随机访问
数据完整性与认证
分组模式仅保证数据的机密性, 但不直接保证数据的完整性或防篡改能力
完整性保障通常需要采用分离的消息验证码 (MAC, Message Authentication Code) 实现, 例如 CBC-MAC。密码学社区认识到需要专门的方法来保证数据的完整性, 因此 NIST 提出了多种消息认证码方案, 包括 HMAC、CMAC 和 GMAC。
认证加密模式
认证加密模式 (AE, Authenticated Encryption or authenc) 为简化加密与认证的组合, 密码学社区提出了将加密与认证结合的单一模式。
AE 模式的典型例子包括 CCM、GCM、CWC、EAX、IAPM 和 OCB
初始化向量 (IV)
初始化向量 (IV, Initialization Vector) 是许多分组模式中用于随机化加密的一块数据。IV 的作用是使相同的明文, 相同密钥下可以产生不同的密文, 而无需重新生成密钥, 从而避免了重新生成密钥这一复杂过程。
初始化向量与密钥相比有不同的安全性需求
- 保密性: IV 通常不需要保密
- 唯一性: 在同一密钥的情况下, IV 不应重复使用
- CBC 和 CFB: 重复使用 IV 会泄露首个块明文的某些信息, 并可能暴露两个不同消息中相同的前缀
- OFB 和 CTR: 重复使用 IV 会导致完全丧失加密安全性
- 不可预测性
- CBC 模式, 加密时 IV 必须是无法预测的
- 某些不安全的 IV 生成方法 (如 SSL 2.0 使用的上一个消息的最后一块密文作为下一个消息的 IV), 是不安全的
填充 (Padding)
在块密码的分组模式中, 不同模式对消息长度的要求和处理方式有所不同
需要填充的模式
- ECB (电子密码本模式)
- CBC (密码块链接模式)
这些模式要求消息长度必须是密码块大小的整数倍。因此, 对于长度不足一个完整密码块的最后一块消息, 需要在加密前进行填充
不需要填充的模式
- CFB (密码反馈模式)
- OFB (输出反馈模式)
- CTR (计数器模式)
这些模式不要求消息长度是密码块大小的整数倍, 最后一个不完整的明文块会与密钥流块的前几个字节异或, 生成与该明文块长度相同的密文块
常见填充模式
PKCS7Padding
PKCS7Padding 的块大小是一个参数, 支持 1 - 255 字节的块大小, 因此适用于更广泛的加密算法 (如 AES)。它的填充方式与 PKCS5Padding 类似, 但适用于任何块大小, 不限于 8 字节, 而 PKCS5Padding 固定为 8 字节。当块大小为 8 字节时, 它们的填充方式完全相同。
PKCS5Padding
PKCS5Padding 是 PKCS7Padding 的子集, 适用于块大小为 8 字节的加密算法 (如 DES)。它填充的方式是确保数据块长度达到 8 字节的整数倍。
在填充的每个字节中写入填充的字节数。例如, 若需填充 3 个字节, 每个字节的值为 03
严格来说, PKCS5Padding 不能与 AES 一起使用, 因为它仅定义了 8 字节的块大小。对于 AES, 块大小始终为 16 字节。我认为, AES/CBC/PKCS5Padding 在内部会被解释为 AES/CBC/PKCS7Padding
ZeroPadding
使用零填充。适用于消息长度固定的情况, 但可能带来歧义 (当明文末尾本身包含零字节时)
原文
golang 中AES加密详解
ECB - CTF Wiki
AES/CBC/PKCS5Padding vs AES/CBC/PKCS7Padding with 256 key size performance java