pkcs5 padding和pkcs7 padding都是加密数据时用来填充数据的一种模式。

先说下block_size,即块大小。在加密算法中(如DES,AES,RSA),数据是分块加密的(为什么要分块,因为整块加密数据量有可能太大)。分块的话,就得按照一定的长度即block_size来分,大多数加密算法中的分块大小默认都是64bits,即8个字节,block_size=8。如果需要加密的数据(明文)的字节码的长度不是块大小的整数倍,那么就需要在末尾进行填充。那么如何填充呢?这就是本文要说的pkcs5和pkcs7填充模式(还有pkcs1,用于RSA加密算法,比较复杂,这里不说了,自行百度)。

重点:PKCS #5 填充字符串由一个1~8位的字节序列组成,每个字节填充“该字节序列的长度”。

使用PKCS5,填充时:

要填充7个字节,那么填入的值就是0×07;

如果只填充1个字节,那么填入的值就是0×01;

示例:

PKCS5的块长度为 8

数据长度为 9时,则填充为8位字节的倍数,需要补7位字节,即填充字节序列的长度等于 7,则每个字节应填充07,示例如下:

数据: FF FF FF FF FF FF FF FF FF

PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

数据长度为 10时,则填充为八位字节的倍数,需要补6位字节,即填充字节序列的长度等于 6,则每个字节应填充06,示例如下:

数据: FF FF FF FF FF FF FF FF FF FF

PKCS7 填充: FF FF FF FF FF FF FF FF FF FF 06 06 06 06 06 06

另外:还有一种情况就是数据长度恰好是8的倍数,那么后面还需要填充吗?

答案是:需要,数据恰好是8的倍数时还要补8个字节的0×08。

正是这种即使恰好是8的倍数也需要再补充字节的规定,可以让解密算法在解密数据后,很确定无误的移除多余的字节。

让我们做一个假设:如果有一个明文恰好是:FF FF FF FF FF FF FF FF FF FF 06 06 06 06 06 06

那么解密后,我怎么知道后面的6个06就是原来的明文,还是末尾的填充?如果我把后面的6位06 06 06 06 06 06当成padding给去掉的话,就破坏了原文,导致解密后的明文与原来的明文不一致。

解决方法就是,这种情况下,明文填充后应该是:FF FF FF FF FF FF FF FF FF FF 06 06 06 06 06 06 08 08 08 08 08 08 08 08,这样的话,就不会出现混乱。解密算法可以确定最后面的8位一定是填充数据,从而避免出现错误。

最后,说一下PKCS7和PKCS5的区别就是数据分块的大小(就是这么简单):

  • PKCS5填充块的大小为8bytes(64位)
  • PKCS7填充块的大小可以在1-255bytes之间。

综上所述,可以说PKCS7是兼容PKCS5的,PKCS5相当于PKCS7的一个子集。

因为AES的要求的分块长度固定为128 比特(密钥key长度则可以是128,192或256比特),所以填充方法一定是PKCS7

本文参考:https://www.cnblogs.com/midea0978/articles/1437257.html

pkcs5 padding和pkcs7 padding的区别相关推荐

  1. PHP 使用 AES/ECB/PKCS7 padding 加密

    很好用的 AES 加密的类,ECB 模式,PKCS7 padding 填充方式. <?phpclass AES {protected $cipher;protected $mode;protec ...

  2. android:padding和android:margin的区别

    转载请说明博客地址:http://blog.csdn.net/qq_32059827/article/details/51487997 看了网上的类似博客,并没有给出确定的区别.现在具体分析一下pad ...

  3. css padding效果,CSS Padding(填充)

    CSS Padding(填充) CSS Padding(填充)属性定义元素边框与元素内容之间的空间. Padding(填充) 当元素的 Padding(填充)(内边距)被清除时,所"释放&q ...

  4. php中padding,css中padding填充详解

    语法: padding:[ | ]{1,4} 默认值:看每个独立属性 适用于:所有元素,除 table-row-group | table-header-group | table-footer-gr ...

  5. html设置padding颜色,CSS Padding(填充)

    CSS Padding(填充) CSS Padding(填充)属性定义元素边框与元素内容之间的空间. Padding(填充) 当元素的 Padding(填充)(内边距)被清除时,所"释放&q ...

  6. android padding作用,android:padding和android:layout_margin的区别

    简单点来说: android:padding是内边距,控件本身的内容与控件边缘的距离. android:layout_margin是外边距,控件与其他控件之间的距离. 下面以具体的例子来进行解释: 1 ...

  7. android开发之android:padding和android:margin的区别

    android:layout_margin:指该控件距离父控件的边距, android:padding: 指该控件内部内容,如文本距离该控件的边距.

  8. 卷积操作中的same padding与valid padding

      最近在研究卷积神经网络,很多卷积操作里头都会有padding这个选项,以keras中的Conv2D为例,padding操作有valid,same,casual等,我只讨论same和valid这两种 ...

  9. iOS-AES加解密各模式(ECB、CBC、CFB、OFB)的实现

    前言 最近和服务器同学对接口进行数据加解密时用到了AES加密.原本以为AES就一种加密形式,对接过程中才学习到AES不同模式.不同填充方式下,结果都不相同.因此去学习了一下AES加密的基本概念.实现原 ...

最新文章

  1. 利用 FastCoding 将对象进行本地持久化
  2. MSTP技术支撑大客户专线——Vecloud
  3. 【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?
  4. c语言中主函数创建链表,主函数怎么调用函数(数据结构,创建链表)
  5. (5) ebj学习:ejb用jpa操作数据库1
  6. 【bfs】廉价最短路径(2013特长生 T4)
  7. 正则高级用法-分组group+替换
  8. 别再用Else语句写代码了!
  9. 信息学奥赛一本通(1330:【例8.3】最少步数)
  10. python安装rarfile模块_python模块整理7-zipfile模块
  11. 全程快捷键!硬核小哥超快配图1700页数学笔记,教你上手LaTeX+Inkscape
  12. mongo go 查询指定字段_使用PyMongo查询MongoDB数据库!
  13. android IM的实现:聊天室(采用smack API)
  14. Deadline提前,引入滚动审稿,想投ACL 2022的同学要抓紧了
  15. Swift基本运算符详解
  16. 联想笔记本thinkbook win10系统安装
  17. XPath Extractor的使用
  18. Coding and Paper Letter(八十七)
  19. 第9章第1节:创建商业计划书封面幻灯片的版式 [PowerPoint精美幻灯片实战教程]
  20. 一年讲50本书,年收入过亿,罗振宇没做到的,樊登读书会凭什么?

热门文章

  1. AI 人工智能之概率论基础(1)
  2. matlab求状态反馈矩阵
  3. Markdown图片本地化
  4. python实现电影票简易预定系统
  5. 海康威视硬件工程师校招一面面经
  6. bin 文件复制十六进制00 到其它地方变为 20
  7. 数字孪生工厂丨智慧工厂孪生驾驶舱,实现智能化精益生产管理
  8. FFMPEG 视频分割和合并
  9. java程序画米奇_儿童简笔画之拿着福字的米奇
  10. 17 小学数学——《三角形内角和》(四下)