分组密码基础与填充
理解分组大小、PKCS7 填充和密码结构
分组密码基础与填充 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
欢迎
分组密码会加密固定大小的分组。当明文未填满一个分组时,就需要进行填充。在本课中,我们将掌握分组密码的结构、填充方案以及它们为何重要。
分组大小回顾
AES 使用 128 位(16 字节)分组。DES 使用 64 位(8 字节)分组。如果明文恰好为 16 字节,它占用一个分组。17 字节则需要两个分组。
为什么需要填充
如果明文为 20 字节,第二个分组中只有 4 字节。密码算法需要一个完整的 16 字节分组。因此,我们使用确定且可逆的方案填充剩余的 12 字节。
PKCS#7 填充
PKCS#7 使用 N 个字节进行填充,每个字节的值都是 N:
- 需要 3 个字节 → 追加:03 03 03
- 需要 12 个字节 → 追加:0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
- 需要 0 个字节 → 追加完整的 16 字节分组:10×16
始终填充一个完整分组
如果明文恰好为 16 字节,PKCS#7 会额外添加一个完整的 0x10×16 分组。这样可以确保接收方始终知道填充在哪里结束:最后一个字节的值会告诉接收方应去除多少个字节。
Python 中的 PKCS#7
def pkcs7_pad(data: bytes, block_size: int = 16) -> bytes:
n = block_size - (len(data) % block_size)
return data + bytes([n] * n)
def pkcs7_unpad(data: bytes) -> bytes:
n = data[-1]
return data[:-n]
填充预言机攻击
如果服务器在解密后透露填充是否有效(通过错误消息或时间差),攻击者就可以在不知道密钥的情况下逐字节解密密文。这在 2010 年攻破了 ASP.NET ViewState。
零填充与 ANSI X.923
零填充:使用 0x00 字节进行填充(存在歧义——原始数据可能以零结尾)。
ANSI X.923:使用零填充,最后一个字节表示数量。
ISO 7816-4:第一个填充字节为 0x80,其余字节为 0x00。
PKCS#7 没有歧义,因此更受推荐。
位级填充(CTS)
Ciphertext Stealing(CTS)完全避免填充:它重新排列最后两个分组,以处理不完整的分组输入。该方法用于磁盘加密(Kerberos 和某些 AES 实现)。
分组大小对安全性的影响
对于 64 位分组(DES、3DES、Blowfish),在 2^32 个分组后会发生生日碰撞(约 32 GB)。浏览器在 2016 年 SWEET32 攻击证明这一问题后禁用了 TLS 中的 3DES。AES 的 128 位分组需要达到 2^64 个分组,实际上是安全的。
无填充模式
AES-CTR 和 AES-GCM 不需要填充:它们将分组密码用作密钥流生成器,并对任意长度的输入执行 XOR。分组边界只是内部实现细节。
快速检查
对于 16 字节分组,使用 PKCS#7 时,向 13 字节的消息追加什么填充?
回顾
您已经掌握了分组密码填充!接下来我们将比较 ECB 和 CBC 模式,从著名的 ECB 企鹅攻击开始。
常见问题解答
「分组密码基础与填充」课时是免费的吗?
是的 — 「分组密码基础与填充」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「分组密码基础与填充」这节课中我会学到什么?
理解分组大小、PKCS7 填充和密码结构 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「分组密码基础与填充」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。