Khorina · 1 天前

密码学常见填充模式汇总

为什么需要填充?

几个方面:

(1)分组密码算法的工作模式如 ECB\CBC 等明确要求输入必须是分组大小的整数倍,流密码模式除外;

(2)抵御不同的密码学攻击,例如加密时如果明文末尾都是固定格式,攻击者就有可能通过预测结尾来反向推到密钥,填充随机或无意义数据可以破坏这种规律;又例如在 RSA 加密,短明文如不填充就可能被暴力穷举,签名亦是如此。

(3)不同系统或者协议里可能需要统一规则,确保数据正确加解密。

因此,填充还是很重要的,我们就从对称加密、非对称加密、签名、摘要等几个大方向开始。

1.对称加密填充模式

1.1 PKCS.7

简单版:填充值为填充字节数,例如现在使用 AES-CBC 加密 27byte 数据,很明显不是 16bytes(分组)的整数倍,因此需要填充至 32byte,填充 5 字节则为 05 05 05 05 05

深挖版:最开始接触到填充模式就是它了,来自 Autosar CSM 中的解释,如下:

image.png

但具体怎么填,它没说,还得去翻 PKCS.7 的原文。

忘记了 RFC 和 PKCS 的同学可以回顾之前的文章:密码学基础--RFC 和 PKCS 是什么

PKCS.7: Crytographic Message Syntax。在 10.3 章节描述了填充方式:

image.png

值得注意的是,它定义的是一种抽象的填充方式,适用于不同长度(1-255 字节)的分组密码算法,因此我们需要投放到特定算法中进行处理。

除了 PKCS.7,在 PKCS.5 6.1.1 章节中也是相同的填充方式,只是它这里固定了 8 字节分组,如下:

image.png

所以,一般来说如果是 AES 加解密,日常使用是把这两种填充模式等价,因为需要按 16byte 分组。

1.2 ISO7816-4

这个标准是智能卡领域的基石,主要用在银行卡、SIM 卡、身份证等行业,

它填充机制很简单,首字节为 0x80,后续全部填充为 0x00。

例如如填充 4 字节为 0x80 0x00 0x00 0x00

在 AUTOSAR CSM 中,它对应这种填充

CRYPTOALGOFAM_PADDING ONEWITHZEROS:

image.png

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),填充流程如下:

image.png

该填充模式的输入包括公钥、原文、Label(可选,如不提供则默认空),输入为 EM;

EM 用公钥加密得到密文,公式为 C = EM^e mod n,(n 模数,e 公钥指数);

RSAES-PKCS1-V1_5 相对简单,流程如下:

image.png

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 分组,需要填充:

image.png

SHA-384、SHA-512、SHA-512/224、SHA-512/256 则以 1024bit 分组:

image.png

END

作者:快乐的肌肉
文章来源:汽车MCU软件设计

推荐阅读

更多物联网安全,PSA 等技术干货请关注平台安全架构(PSA)专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入PSA 技术交流群,请备注研究方向。
推荐阅读
关注数
4574
内容数
210
Arm发布的PSA旨在为物联网安全提供一套全面的安全指导方针,使从芯片制造商到设备开发商等价值链中的每位成员都能成功实现安全运行。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息