欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 密码学常见填充模式汇总

密码学常见填充模式汇总

2025/4/4 21:15:50 来源:https://blog.csdn.net/djkeyzx/article/details/146945665  浏览:    关键词:密码学常见填充模式汇总

目录

1.对称加密填充模式

1.1 PKCS.7

1.2 ISO7816-4

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词