为什么需要填充?
几个方面:
(1)分组密码算法的工作模式如 ECB\CBC 等明确要求输入必须是分组大小的整数倍,流密码模式除外;
(2)抵御不同的密码学攻击,例如加密时如果明文末尾都是固定格式,攻击者就有可能通过预测结尾来反向推到密钥,填充随机或无意义数据可以破坏这种规律;又例如在 RSA 加密,短明文如不填充就可能被暴力穷举,签名亦是如此。
(3)不同系统或者协议里可能需要统一规则,确保数据正确加解密。
因此,填充还是很重要的,我们就从对称加密、非对称加密、签名、摘要等几个大方向开始。
1.对称加密填充模式
1.1 PKCS.7
简单版:填充值为填充字节数,例如现在使用 AES-CBC 加密 27byte 数据,很明显不是 16bytes(分组)的整数倍,因此需要填充至 32byte,填充 5 字节则为 05 05 05 05 05
深挖版:最开始接触到填充模式就是它了,来自 Autosar CSM 中的解释,如下:
但具体怎么填,它没说,还得去翻 PKCS.7 的原文。
忘记了 RFC 和 PKCS 的同学可以回顾之前的文章:密码学基础--RFC 和 PKCS 是什么
PKCS.7: Crytographic Message Syntax。在 10.3 章节描述了填充方式:
值得注意的是,它定义的是一种抽象的填充方式,适用于不同长度(1-255 字节)的分组密码算法,因此我们需要投放到特定算法中进行处理。
除了 PKCS.7,在 PKCS.5 6.1.1 章节中也是相同的填充方式,只是它这里固定了 8 字节分组,如下:
所以,一般来说如果是 AES 加解密,日常使用是把这两种填充模式等价,因为需要按 16byte 分组。
1.2 ISO7816-4
这个标准是智能卡领域的基石,主要用在银行卡、SIM 卡、身份证等行业,
它填充机制很简单,首字节为 0x80,后续全部填充为 0x00。
例如如填充 4 字节为 0x80 0x00 0x00 0x00
在 AUTOSAR CSM 中,它对应这种填充
CRYPTOALGOFAM_PADDING ONEWITHZEROS:
1.3 不怎么用的几种填充
下面三种或多或少有点类似,但由于各种原因用的较少,填充方式仅作了解即可。
ISO 10126 填充字节的最后一个字节为填充长度,其余为随机值(如填充 4 字节可能为 0xAB 0x1C 0x5B 0x04),但这个随机数来源一直没有证据证明没有漏洞;
ANSI X923 则为填充字节末尾为填充长度,其余填 0(如填充 4 字节为 0x00 0x00 0x00 0x04);
ZeroPadding 顾名思义,就是在文末增加填充值为 0x00 的字节。
2.非对称加密填充模式
这个之前聊过多次了,详见为什么 RSA 公钥加密结果不是固定值?
我们在简单回顾一下:
加密填充我们可以看 PKCS#1 v2.1 版本,提供了两种填充模式:RSAES-OAEP、RSAES-PKCS1-V1_5
RSAES-OAEP(Optimal Asymmetric Encryption Padding),填充流程如下:
该填充模式的输入包括公钥、原文、Label(可选,如不提供则默认空),输入为 EM;
EM 用公钥加密得到密文,公式为 C = EM^e mod n,(n 模数,e 公钥指数);
RSAES-PKCS1-V1_5 相对简单,流程如下:
EB 整体由 00 || BT || PS || 00 || D 拼接组成:
- 第一个 00:确保加密块转换成整数后小于模数;
- BT:Block Type,当前版本仅有 00、01、02 取值;00、01 表示私钥操作,02 表示公钥操作;这里用的是公钥加密,因此为 02;
- PS:Padding String,包含 k-3-D 个字节,k 指模数,D 为数据;但是!!!
BT == 00 时,填充字节值为 0;
BT == 01 时,填充字节值为 FF;
BT == 02 时,填充字节应该是伪随机生成的非零值。
- D:原始数据
PKCS#1 v1.5 因填充结构固定 00 02 [随机非零填充] 00 [明文],攻击者可通过分析填充部分的规律性(如固定前缀)推断明文结构,尤其当明文较短时,随机填充可能被穷举破解。
因此,目前主流的 RSAES 都采用 OAEP 填充。
3.签名和验签填充模式
依旧是 RSA,两种模式:RSASSA-PSS、RSASSA-PKCS1-v1_5
这个聊了很多次,详见密码学基础--RSA 签名,你该选什么填充模式?
4.Hash 函数填充
这个主要是位填充,来源于标准 FIPS 180-4, 填充方法为消息末尾添加 1 后补 0,最后 64\128 位写入消息长度(以位为单位)。
SHA1、SHA-224 和 SHA-256 以 512bit 分组,需要填充:
SHA-384、SHA-512、SHA-512/224、SHA-512/256 则以 1024bit 分组:
END
作者:快乐的肌肉
文章来源:汽车MCU软件设计
推荐阅读
- Weaver - 基于安全硬件的锁屏密码方案
- 智能驾驶车辆行车安全的两难困境和不可能三角场景
- 一文让你搞懂 UEFI
- 安全芯片的守护神:BIST 机制的深度解析
- 02 | 芯片: GPU 怎么就成了科技界的“新宠”?
更多物联网安全,PSA 等技术干货请关注平台安全架构(PSA)专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入PSA 技术交流群,请备注研究方向。