如 AES,DES 一类的分组对称加密算法要求明文数据的字节长度必须是其块大小的倍数,因此在加密明文数据之前我们必须对明文数据进行填充。

概述

在分组对称加密算法中,我们通常在加密之前在明文数据的末尾添加对应的填充数据使数据达到算法块大小的倍数;并且在解密数据之后将对应的填充内容去掉。

填充的方法具体来说分为基于二进制位 bit 的和基于字节 byte 的。其中基于字节的填充分为:ANSI X9.23,ISO 10126,PKCS#5 与 PKCS#7,零填充。本文中涉及到的字节数据均使用 16 进制表示。

本篇文章资料来源于 Padding (cryptography)。

二进制位填充(Bit Padding)

二进制位填充可以用于填充任意大小的明文数据。二进制位填充的原理是在数据的末尾的第一个二进制位填充 1,然后在后面填充 00 的数量由业务需要的填充位数决定。

二进制位填充可以填充以二进制位为单位的数据,也可以填充以字节为单位的数据。当它以字节为单位进行填充时,又称为 ISO/IEC 7816-4 填充,也就是填充内容类似 0x80 0x00 这样的填充。

下面是一个基于二进制位的填充案例,假设我们有一个 23 bit 的明文数据,需要填充 9 bit 到 32 bit,那么我们需要填充 1 bit 的 1 和 8 bit 的 0

# 明文数据
...... | 1011 1001 1101 0100 0010 011
# 填充后的数据
...... | 1011 1001 1101 0100 0010 011 1 0000 0000 |

对于字节填充来说,假设我们需要将数据填充 4 个 byte 达到 8 byte 的块大小,我们需要在数据末尾的第一个字节填充 0x80,后面三个字节填充 0x00

# 明文数据
...... | DD DD DD DD DD DD DD DD | DD DD DD DD
# 填充后的数据
...... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |

ANSI X9.23

ANSI X9.23 是针对块大小为 8 的算法设计的填充模式,需要注意的是该标准已经被撤销。

在 ANSI X9.23 中,使用 0x010x08 对数据进行填充。对于填充内容可以使用任意随机数(一般来说固定使用 0x00),并且将填充内容的最后一个字节设置为填充内容的长度。事实上我们可以很容易的将该标准应用于填充 0x010xFF 范围的数据块。

下面是块大小为 8 个字节,需要填充 4 个字节的内容:

# 明文数据
...... | DD DD DD DD DD DD DD DD | DD DD DD DD
# 填充后的数据
...... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |

注意:ANSI X9.23 对于刚好是块大小倍数的明文数据不进行填充。

ISO 10126

ISO 10126 目前也是已经撤销的标准,它在设计上和 ANSI X9.23 标准有些类似,均是通过随机数作为填充内容并在填充内容的最后一个字节指定填充内容的长度。

下面是块大小为 8 个字节,需要填充 4 个字节的内容:

# 明文数据
...... | DD DD DD DD DD DD DD DD | DD DD DD DD
# 填充后的数据
...... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |

注意:ISO 10126 对于刚好是块大小倍数的明文数据也会进行填充^1:

下面是块大小为 8 个字节,需要填充 8 个字节的内容:

# 明文数据
...... | DD DD DD DD DD DD DD DD |
# 填充后的数据
...... | DD DD DD DD DD DD DD DD | 98 EF 35 27 81 A6 23 08 |

PKCS#5 与 PKCS#7

PKCS#7 实际上是为了支持 AES 算法而对 PKCS#5 做的扩展,因为 PKCS#5 设计上只是针对 8 字节大小的块做填充的。也就是说,在实践中 PKCS#5 和 PKCS#7 是等同的。

PKCS#7 的 RFC 规范见 RFC 5652 - Section-6.3。

PKCS#7 的填充内容其实就是要填充的数据长度,如果要填充 N 个字节,那么每个字节都是 N 。需要添加的字节数取决于块的大小,当且仅当 N 小于 256 时,该填充方法是有效的。

填充的内容可能是下面的某一种:

01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06 06
......

下面是块大小为 8 个字节,需要填充 4 个字节内容;和块大小为 8 个字节,需要填充 8 个字节内容的案例:

# 明文数据
...... | DD DD DD DD DD DD DD DD | DD DD DD DD
# 填充后的数据
...... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |# 明文数据
...... | DD DD DD DD DD DD DD DD |
# 填充后的数据
...... | DD DD DD DD DD DD DD DD | 08 08 08 08 08 08 08 08 08 |

这里如果数据长度已经是块大小的倍数了,还是需要填充块大小长度的填充内容。只有这样在解密的时候,算法才能确定的认为解密出来的数据的最后一位是填充的内容,并且填充的数据长度就是该字节的大小。否则,算法无法判断最后一个字节是填充值还是明文值,也就无法进行去掉填充内容的操作。

零填充

零填充是指将需要填充的所有字节都填充为零,该方案尚未被标准化。零填充也被叫做空填充零字节填充

下面是块大小为 8 个字节,需要填充 4 个字节内容的案例:

...... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |

注意:如果填充的明文数据本来就以一个或多个零字节接收,那么零填充在解密后可能无法被去填充,原因是解密算法无法区分零字节是明文数据的还是填充内容。一般而言,比较适用于填充二进制编码的字符串,在字符串中空字符 0x00 被看做是字符串结束的字节,是可以被剥离的。

如果数据长度已经是块大小的倍数了,视情况可以填充块大小长度的填充内容,这视具体的实现而定。

des加密去掉特殊字符_对称加密中的数据填充相关推荐

  1. mysql对称连接什么意思_对称加密与非对称加密的区别是什么

    区别:1.对称加密中加密和解密使用的秘钥是同一个:非对称加密中采用两个密钥,一般使用公钥进行加密,私钥进行解密.2.对称加密解密的速度比较快,非对称加密和解密花费的时间长.速度相对较慢.3.对称加密的 ...

  2. java祖冲之加密算法_对称加密和非对称加密

    一  非对称加密 非对称加密和解密花费的时间长 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey),一般使用公钥进行加密,使用私钥进行解密. 常见的非对称加密 ...

  3. 在线加密解密网站(对称加密:AES、DES、RC,非对称加密:RSA)

    前两天写AES加密相关代码,学习的同时找到一个在线加密解密的网站,帮助自己快速理解了一下,推荐给学习加密的同学.在线加密网站,一开始接触加密(AES等)可以在这里体验下加密与解密,助于快速理解加密模式 ...

  4. 加密基础知识二 非对称加密RSA算法和对称加密

    一.RSA的计算过程 上述过程中,出现了公钥(3233,17)和私钥(3233,2753),这两组数字是怎么找出来的呢?参考RSA算法原理(二) 首字母缩写说明:E是加密(Encryption)D是解 ...

  5. java对称加密,java异或加密,Java高性能对称加密

    学过网络安全的可能知道加密可分为对称加密与非对称加密,比如大名鼎鼎的ssh.非对称加密有RSA,sm9等,对称加密有DES,sm4算法等,但是计算机基础比较扎实的可能知道一个值a与值b异或操作2次后可 ...

  6. 客户端和服务器不支持一般 ssl 协议版本或加密套件。_恶意软件加密通信概要分析...

    作者:Jo@北京观成科技 恶意加密流量是当前流量安全检测的痛点和难点.在未解密的情况下如何检测恶意加密流量,机器学习可提供颇为有效的解决方案.传统机器学习依赖于训练数据集和特征工程,而搜集的各类恶意加 ...

  7. python字符串去掉空行_从python中的字符串中删除空格

    python字符串去掉空行 如何在python中删除字符串中的空格 (How to remove whitespaces in a string in python) str.lstrip()str. ...

  8. bitlocker加密好慢_如何加密磁盘?(适用于全平台)

    如何加密磁盘(适用于全平台) 加密效果 加密完成后的磁盘(硬盘)在插入任何系统之后均为"未挂载"状态,只有通过软件进行解密之后才会挂载成功,并可以显示使用.软件同时支持Window ...

  9. es重建字段类型_关于elasticsearch中更新数据的几种方式

    作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式. (一)更新文档 (1)部分更新: java api: ` HashMa ...

最新文章

  1. 黑科技!当会爬虫的Python遇上会画图的FineBI……
  2. java web快速入门_Web安全快速入门
  3. matlab mcc 安装,matlab中安装mcc
  4. 微信公众号web端关闭本页面
  5. 中文情感分析——snownlp类库 源码注释及使用
  6. EXCHANGE 2003 恢复存储组的使用
  7. chromium笔记目录
  8. 如何设计一款智能烧烤锅?
  9. 大菠萝?Pinia已经来了,再不学你就out了
  10. linux安装lsi raid卡驱动下载,【LSIRAID卡驱动下载】LSIRAID卡官方驱动程序下载
  11. 12306怎样才能防止抢票?
  12. 「2022 最新版」未认证微信公众号图文中插入外部链接教程
  13. 网购使用的计算机网络技术,浅议计算机网络技术的应用与发展
  14. 黑苹果 服务器系统安装教程,黑苹果安装教程,详细教您黑苹果怎么安装
  15. 《后浪》:B站该为自己敲响的警钟
  16. 如何在线将XPS转换成PDF?
  17. 网络犯罪市场Deer.io俄罗斯管理员在美国被判入狱
  18. sql server 发布订阅
  19. 初次安装RedFlag5+Oracle
  20. 兴安雪学运维之:CentOS用户组管理groupadd,groupdel...

热门文章

  1. c#中怎样取得某坐标点的颜色
  2. Spring EL运算符实例
  3. ASP.NET Web API身份验证和授权
  4. Java——遍历List过程中添加和删除元素的问题(亲测第二种)
  5. IDEA 2020.3.2控制台中文乱码分享(亲测二、下图中控制台的编码改为UTF-8)
  6. 分布式数据库中间件Mycat百亿级数据存储(转)
  7. PHP的闭包函数匿名函数
  8. java类方法不可见_使java方法仅对特定类可见
  9. PHP非对称加密:RSA (RSA/ECB/PKCS1Padding)+base64_encode/bin2hex加密
  10. 程序员如何克服焦虑?