分钟密码填充模式介绍
经典填充方式
1、NoPadding
不填充,在此填充下原始数据必须是分组大小的整数倍,非整数倍时无法使用该模式,会报错。
2、Zero Padding
原文不符合分组长度,填充0至满足分组长度,原文符合分组长度增加一个全0的分组。
原始:FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00
应用:
已知数据对齐的场景:如流加密模式(CTR、OFB)中明文长度已确定,无需动态填充。
特定协议要求:如某些物联网设备通信协议为减少计算开销,强制使用零填充,但需配合严格长度校验以避免截断风险。
局限性:因填充后无法自动区分有效数据和填充内容,易导致解密错误或安全漏洞,需谨慎使用。
3、PKCS7Padding
支持1-255字节的块大小
,适用于AES(16/24/32字节块)、SM4(16字节块)等现代加密算法,尤其在使用CBC、CFB等需要块对齐的分组模式
原文不符合分组长度是要填充至符合块大小的整数倍,填充值为填充字节数,即需要补充的字节个数是N,则填充N字节数据,且每个字节均为N的数据(填充值为0x0N);
若数据长度正好为块大小的整数倍,则额外填充一个完整块(如16个0x10)
示例1:
原始:FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF 06 06 06 06 06 06 06
示例2:
原始:FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07 07
示例3:
原始:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
应用:
PKCS7是当下各大加密算法都遵循的填充算法,且 OpenSSL 加密算法默认填充算法就是 PKCS7。主要原因如下:
高安全性场景:如金融交易、敏感数据传输,因其填充规则可防止信息泄露(通过分析填充字节长度确保完整性)。
通用数据加密:适用于文件加密、数据库字段加密等场景,支持灵活的块大小(1~255字节),兼容性强。
重点:
PKCS7填充规则通过以下机制防止信息泄露并确保数据完整性:
(1)确定性的填充规则
PKCS7要求填充字节的值与填充长度严格对应(例如,缺3字节则填充3个0x03),解密时通过最后一个字节的值可明确识别填充长度并移除填充。这种确定性避免了填充内容歧义,防止攻击者通过篡改填充数据破坏完整性。
(2)完整性校验机制
解密时需验证所有填充字节的值是否一致且符合块大小范围(如块大小为16时,填充值必须≤16)。若填充值无效(如0x11在16字节块中),则判定数据被篡改并拒绝处理,从而保护数据完整性。
(3)防止基于填充长度的推断攻击
传统填充方式(如ZeroPadding)可能因数据尾部含零值导致填充误判,攻击者可借此推测明文内容或长度。而PKCS7的填充值与数据内容无关,统一规则降低了通过分析填充模式推断明文信息的风险。
(4)强制完整块填充
即使明文长度符合分组大小的整数倍,PKCS7仍要求额外填充一个完整块(如16个0x10)。这使密文长度与明文长度的关联性被破坏,避免攻击者通过密文长度反推明文长度或结构。
①强制填充完整块可确保解密时无歧义地识别并移除填充,避免以下风险:
若数据末尾恰好包含类似填充的字节(如数据末尾有0x01),可能被误判为填充而截断,导致数据损坏。
示例:(块大小=4字节):
明文:"abcd"(长度4字节,已对齐块大小)。 PKCS7填充后:"abcd<font color=#dd0000>\x04\x04\x04\x04</font><br/>"(追加4个0x04,总长度8字节)。 解密流程:读取最后一个字节0x04 → 移除最后4字节 → 恢复原始明文"abcd"。 若不填充:若数据本身为"abca"(末尾为0x01),可能被误判为填充1字节,导致错误移除。
②防止密文长度泄露明文信息
强制填充完整块可破坏密文长度与明文的直接关联,避免攻击者通过分析密文长度推断明文特征:若明文长度正好是算法分组大小的整数倍时不填充,密文长度会比其他情况少一个块,攻击者可借此推测明文长度或结构,而强制填充后:所有密文长度均为块大小的整数倍,消除此类信息泄露。。
示例:
明文1:"12345678"(8字节,DES块大小)。
明文2:"1234567"(7字节)。
未填充时:明文1加密后为1个块(8字节),明文2加密后为2个块(16字节,填充1字节)。
攻击者观察密文长度:发现某些密文少一个块,可推断对应明文长度是块大小的整数倍。
③ 统一处理逻辑,简化实现
强制填充使加密与解密逻辑完全对称,无需根据明文长度动态判断是否填充:
加密时:无论明文是否对齐,统一添加填充块。解密时:只需检查最后一个字节确定填充长度,无需额外逻辑判断。
优势:降低代码复杂度,减少因逻辑分支导致的漏洞(如未处理边界条件)。
④实际应用中的必要性
安全协议要求:如TLS/SSL、IPSec等强制使用PKCS7填充,确保协议层的数据完整性。
抵御填充预言攻击(Padding Oracle Attack):强制填充使攻击者无法通过篡改填充字节观察解密程序的不同响应(如错误类型),从而无法推导密钥或明文。
4、PKCS5Padding
PKCS5Padding 支持大小为 8 个字节
的块。
填充方式同PKCS7 Padding, 补充长度为1-8字节。
原始:FF
填充:FF 07 07 07 07 07 07 07
原始:FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF 08 08 08 08 08 08 08 08
应用:
例如DES等传统加密算法,常见于遗留系统或需兼容旧标准(如早期SSL/TLS协议)的场景。
固定块需求场景:在嵌入式设备或低资源环境中,因实现简单且块大小固定,适合硬件加密芯片等场景。
5、TBCPadding填充
填充至符合块大小的整数倍,原文最后一位为“1”时填充 0x00,最后一位为“0”时填充“0xFF”。
原始:FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00
原始:FF FF FF FF FF FF FF FF F0
填充:FF FF FF FF FF FF FF FF F0 FF FF FF FF FF FF FF
6、ISO10126Padding
填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节随机处理。
原始:FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF 3F 7A B4 09 14 36 07
7、ISO7816-4Padding
填充至符合块大小的整数倍,填充值第一个字节为 0x80,其他字节填 0。
原始:FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00 00
8、X923Padding
填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节填 0。
原始:FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07
9、PKCS1Padding
该填充模式是 RSA 加密中使用的,详见 RFC 2313。RSA 加密时,需要将原文填充至密钥大小,填充的格式为:00 + BT + PS + 00 + D
00 为固定字节
BT 为处理模式。公钥操作时为 02,私钥操作为 00 或 01
PS 为填充字节,填充数量为 k -3 - D,k 表示密钥长度,D 表示原文长度。PS 的最小长度为 8 个字节。填充的值根据 BT 值不同而不同:
BT = 00 时,填充全 00
BT = 01 时,填充全 FF
BT = 02 时,随机填充,但不能为 00
本文中使用的部分图片来自于网络,如有侵权,请联系博主进行删除

浙公网安备 33010602011771号