Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​聊聊密码学中的Padding

​聊聊密码学中的Padding

原创
作者头像
王沛文
发布于 2019-09-04 12:44:36
发布于 2019-09-04 12:44:36
6.1K0
举报
文章被收录于专栏:王沛文的专栏王沛文的专栏

前言

用过RSA做加解密的同学一定曾经被RSA的各种Padding所困扰过。NoPadding、PKCS1Padding、OAEPPadding,有的地方说不要用NoPadding,要用PKCS1Padding;有的地方却说PKCS1Padding不安全,要用OAEPPadding...

为什么要有Padding?Padding又是起什么作用?这就得从加密说起。

块加密中的Padding

我们常用的AES、DES等对称加密算法都是基于固定长度的块。比如AES的块大小就固定是16字节。对超过16字节的数据进行加解密时,就需要使用各种分组模式对数据进行分组处理组合。

然而并不是所有的数据都是16字节的整数倍长,因此会经常出现最后一个块不能被填满的场景。加密过的块一定是16字节的整数倍,那如何让解密方能够知道原始数据具体有多长就是个问题了。

有人可能会说这有什么麻烦的,原始数据的最前面贴个length不就行了。

如果需求本身只是把数据填充到指定长度,并保留原始数据的长度本身并不复杂,人们也提出过各种各样的方案。光维基百科里就列出了这么多中方法。

方法多并不是什么好事,大家都用同样的方法才能减少各种对接沟通成本。因此(RFC 5652)http://tools.ietf.org/html/rfc5652#section-6.3中规定了PKCS#7Padding流程,这个流程简单描述就是

末尾填充的每个字节均为填充长度

即如果Padding长度为5,那解密数据尾部就是05 05 05 05 05,即5个05

如果Padding长度为1,那解密数据尾部就是01,即1个01

那如果原始数据正好就是16呢?因为PKCS#7规定Padding必须存在,因此即使原始数据是16的整数倍,也需要在末尾追加16字节的Padding,即正好追加一个块,这个块每个字节都是0x10

当然还有Padding大于255的场景,不过这种场景很少就不再这里细说了。

RSA中的Padding

因为对称加密中的常用的Padding方式基本只有一种那就是PKCS#7。所以通常使用中不会出什么问题。让人困扰的一般都是RSA的Padding。

为什么RSA的Padding总是让人绞尽脑汁呢?因为RSA的Padding不只是Padding。为什么这么说呢?我们上面提到过,Padding最初只是用来填充数据到指定长度。但是在RSA中这个问题复杂化了。

对于常见的对称加密方案中,通常存在下面几个元素

  • 加密算法 比如AES
  • 分组模式/AEAD模式 比如CBC/GCM
  • 密钥
  • iv/nonce 随机数

Padding只是作用于分组模式中的小小的一部分,辅助将原始数据填充到指定长度。有的分组方式(比如CTR)甚至不需要Padding。

而RSA通常不会加密特别长的数据,因此没有分组模式的概念,对于RSA来说Padding是分组模式和随机数的合。即RSA的Padding包含了将数据填充到RSA密钥位数的长度的方法,还有填充随机数到RSA原文的方法。

我们知道RSA算法的本质就是大数运算

代码语言:txt
AI代码解释
复制
m^e ≡ c (mod n)
c^d ≡ c (mod n)

其中m是原文,c是密文

如果使用原始的RSA做加解密操作,则并不包含随机数,相同的密文会生成相同的明文。同时由于大部分情况下m相比n小很多,甚至m^e都比n要小,这时候很容易通过枚举倍数破解明文。

因此RSA加解密算法很需要有效的Padding算法将明文填充到足够长保证不容易被暴力破解,同时也需要加入随机因子保证密文的随机性。

PKCS1-v1.5 Padding

根据RFC 3447描述PKCS1-V1.5 Padding

代码语言:txt
AI代码解释
复制
EM = 0x00 || 0x02 || PS || 0x00 || M

其中EM是填充过的消息,M是原文,PS是随机数 长度为RSA len - 3 - M len

方法很简单也很直观。

如果也和对称加密一样大家都用这个Padding方案,那也就不会有各种各样RSA的Padding问题了

然而 PKCS1 Padding存在漏洞

RSA-OAEP和RSASSA-PSS

为了解决PKCS1 Padding的各种问题

人们又针对签名和加密场景分别提出了RSA-OAEP和RSASSA-PSS这两种Padding方案

根据RFC 8017描述 Padding的生成过程相当复杂,有12步。其中包含了生成hash并填充到原文中

这里就不具体描述了

尾声

扯了这么久,估计大家可能还是没搞懂到底有多少种Padding,分别用在什么场景。

总之今后协议对接的场景多注意Padding这个信息就好。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
写给开发人员的实用密码学 - 对称加密算法
所谓数据加密,就是将一段数据处理成无规则的数据,除非有关键的密钥,否则谁也无法得知无规则数据的真实含义。
云水木石
2021/01/27
1.3K0
写给开发人员的实用密码学 - 对称加密算法
Android O中对TEE加解密算法的新要求
我们都知道,Android中keystore机制中的keymaster需要在TEE实现。Google关于Android后续版本中keymaster中的加解密算法要求如下: RSA 无填充 RSAES-OAEP (PaddingMode::RSA_OAEP) RSAES-PKCS1-v1_5 (PaddingMode::RSA_PKCS1_1_5_ENCRYPT) SHA-256 RSASSA-PSS (PaddingMode::RSA_PSS) RSASSA-PKCS1-v1_5 (PaddingMode:
安智客
2018/02/24
1.5K0
网络安全&密码学—python中的各种加密算法
数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露、篡改或滥用。加密后的数据(密文)可以通过解密过程恢复成原始数据(明文)。数据加密的核心是密码学,它是研究密码系统或通信安全的一门学科,包括密码编码学和密码分析学。
小羽网安
2024/07/02
5550
网络安全&密码学—python中的各种加密算法
加密与安全_AES & RSA 密钥对生成及PEM格式的代码实现
在现代信息安全中,加密算法扮演着至关重要的角色。今天我们来聊聊两种常见的加密算法——RSA和AES,用通俗易懂的语言带大家理解它们的核心原理和优缺点。
小小工匠
2024/05/27
7170
JDK安全模块JCE核心Cipher使用详解
javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适。Cipher是JCA(Java Cryptographic Extension,Java加密扩展)的核心,提供基于多种加解密算法的加解密功能。在不了解Cipher之前,我们在完成一些需要加解密的模块的时候总是需要到处拷贝代码,甚至有些错误的用法也被无数次拷贝,踩坑之后又要拷贝补坑的代码。为什么不尝试理解Cipher然后合理地使用呢?
Throwable
2020/06/23
3.2K0
对称加密算法和分组密码的模式
由于加密出来的数据很可能有很多不可见字符,因此这里会将加密后的结果进行一次Base64Encode。
linjinhe
2018/06/06
2.6K0
30分钟搞定AES系列(上):基础特性
AES是对称加密算法的一种,全称是ADVANCED ENCRYPTION STANDARD。
bowenerchen
2022/11/15
5.5K2
30分钟搞定AES系列(上):基础特性
【密码学】为什么不推荐在对称加密中使用CBC工作模式
这篇文章是我在公司内部分享中一部分内容的详细版本,如标题所言,我会通过文字、代码示例、带你完整的搞懂为什么我们不建议你使用cbc加密模式,用了会导致什么安全问题,即使一定要用需要注意哪些方面的内容。
9eek
2023/05/23
3.2K1
【密码学】为什么不推荐在对称加密中使用CBC工作模式
循序渐进学加密
还记得上初二的那年夏天,班里来了一个新同学,他就住在我家对面的楼里,于是我们一起上学放学,很快便成了最要好的朋友。我们决定发明一套神秘的沟通方式,任何人看到都不可能猜到它的真实含义。我们第一个想到的就是汉语拼音,但很显然光把一个句子变成汉语拼音是不够的,于是我们把26个英文字母用简谱的方式从低音到高音排起来,就得到了一个简单的密码本:
知识与交流
2021/04/02
8920
现代密码学实践指南[2015年]
本文介绍目前现代密码学的最先进技术, 前半部分主要翻译自 《Cryptographic Right Answers》,附上收集的资料,和byron个人的理解。
byronhe
2021/06/25
1.1K0
Android 安全
MD5长度默认是128bit,这样表达不好,所以将二级制转换成16进制,4bit代表一个16进制,所有128/4=32 ,所以为32位16进制。 MD5 16位与32位区别是将32位后面的16位去掉,得到的16位
Yif
2019/12/26
1.1K0
RSA签名的PSS模式
PSS 私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。
mariolu
2018/12/24
9.2K1
简单小结密码学入门知识点
  密码,最初的目的是用于对信息加密,计算机领域的密码技术种类繁多。但随着密码学的运用,密码还被用于身份认证、防止否认等功能上。密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。
步履不停凡
2019/08/23
2.2K0
简单小结密码学入门知识点
java加解密实例
序 本文主要小结一下java里头的AES以及RSA加解密。 AES 使用AES加密时需要几个参数: 密钥长度(Key Size) AES算法下,key的长度有三种:128、192和256 bits。
code4it
2018/09/17
1K0
java加解密实例
对称算法(分组算法) 非对称算法 Hash算法 密码键盘中的常用名称解释 Pinblock: ANSI9.8 算法
解释:pin block,顾名思义就是pin块,密码块的意思,实际上是对pin原文做一定转换后的结果
zhangjiqun
2024/12/16
1490
TLS协议分析 (四) handshake协议概览
TLS 1.3对握手做了大修改,下面先讲TLS 1.2,讲完再介绍一下分析TLS 1.3.
用户8964349
2021/09/07
1.6K0
加密与安全_探索对称加密算法
对称加密算法是一种加密技术,使用相同的密钥来进行加密和解密数据。在这种算法中,发送方使用密钥将明文(未加密的数据)转换为密文(加密的数据),而接收方使用相同的密钥将密文还原为明文。
小小工匠
2024/05/26
2150
加密与安全_探索对称加密算法
斯坦福大学密码学-基于陷门置换的公钥加密 11
注意:G在现实中有一个参数,叫安全参数,指定了这个密钥生成算法将要生成的密钥大小。
Daffy
2020/11/07
2.6K0
【爬虫知识】爬虫常见加密解密算法
本文总结了在爬虫中常见的各种加密算法、编码算法的原理、在 JavaScript 中和 Python 中的基本实现方法,遇到 JS 加密的时候可以快速还原加密过程,有的网站在加密的过程中可能还经过了其他处理,但是大致的方法是一样的。
K哥爬虫
2021/08/03
8.5K0
【爬虫知识】爬虫常见加密解密算法
C++ CryptoPP使用RSA加解密
Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库。它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto++ 的目标是提供高性能和可靠的密码学工具,以满足软件开发中对安全性的需求。RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,由三位密码学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年共同提出。RSA算法被广泛应用于信息安全领域,特别是在数字签名和密钥交换等场景中。
王瑞MVP
2023/12/01
1.6K0
C++ CryptoPP使用RSA加解密
推荐阅读
相关推荐
写给开发人员的实用密码学 - 对称加密算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档