密码学常见填充模式汇总

目录

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分组:

相关推荐
christine-rr1 天前
密码学基础——古典密码学
密码学
it技术分享just_free2 天前
软考教材重点内容 信息安全工程师 第21章 网络设备安全
web安全·网络安全·信息安全·系统安全·软考
christine-rr4 天前
密码学基础——密码学相关概念
网络·安全·密码学·加密
AntResearch4 天前
蚂蚁集团主导的ISO密码学国际标准立项,纳入国产算法
网络·密码学
攻城狮7号5 天前
【密码学】一文了解密码学的基本
信息安全·密码学
NWJ_MP6 天前
解决关于原生gmssl无法直接输出sm2私钥明文的问题
密码学·gmssl·sm2·sm2 私钥
屎派克7 天前
密码学——知识问答
安全·密码学
靖靖桑7 天前
深入理解椭圆曲线密码学(ECC)与区块链加密
区块链·密码学
网安秘谈9 天前
椭圆曲线密码学(ECC)深度解析:下一代非对称加密的核心
密码学