分钟密码填充模式介绍

经典填充方式

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

posted @ 2025-03-25 16:40  霍易  阅读(221)  评论(0)    收藏  举报