密码学常见填充模式汇总

目录

1.对称加密填充模式

[1.1 PKCS.7](#1.1 PKCS.7)

[1.2 ISO7816-4](#1.2 ISO7816-4)

[1.3 不怎么用的几种填充](#1.3 不怎么用的几种填充)

2.非对称加密填充模式

3.签名和验签填充模式

4.Hash函数填充


不废话,直入主题。

为什么需要填充?

几个方面:

(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(2)-CSDN博客

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中,它对应这种填充CRYPTO_ALGOFAM_ 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分组:

相关推荐
Whoami!14 小时前
5-4〔OSCP ◈ 研记〕❘ SQL注入攻击▸基于 UNION 的SQLi
网络安全·信息安全·sql注入·oscp
openHiTLS密码开源社区2 天前
【密码学实战】openHiTLS s_server命令行:搭建国密标准安全通信服务器
服务器·物联网·密码学·openhitls·tlcp·商用密码算法·dtlcp
我不是QI2 天前
DES 加密算法:核心组件、加解密流程与安全特性
经验分享·算法·安全·网络安全·密码学
要做朋鱼燕3 天前
密码学安全:CIA三元组与三大核心技术
网络·笔记·密码学·嵌入式·加密·aes
思成不止于此4 天前
软考中级软件设计师备考指南(四):I/O 技术、安全与可靠性 —— 综合应用篇
网络·笔记·学习·信息安全·总线系统·i/o 技术·可靠性计算
思考的笛卡尔8 天前
密码学基础:RSA与AES算法的实现与对比
网络·算法·密码学
openHiTLS密码开源社区8 天前
【密码学实战】openHiTLS passwd命令行:专业密码哈希生成工具
linux·密码学·哈希算法·ldap·密码策略·随机盐值
啥都不懂的小小白8 天前
密码学入门:从古典加密到现代网络安全
安全·web安全·密码学
vlln8 天前
【调研】加密货币/BTC/区块链的发展历史(2025)
区块链·密码学
要做朋鱼燕8 天前
【AES加密专题】1.AES的原理详解和加密过程
运维·网络·密码学·c·加密·aes·嵌入式工具