常见加解密算法06 - 分组密码的填充与工作模式

2024-09-04 14:20

本文主要是介绍常见加解密算法06 - 分组密码的填充与工作模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

各位英姿焕发,风华正茂的读者们你们好啊,今天我们讨论一下分组密码的填充与工作模式。

分组密码中,需要将明文按指定大小进行分组,由于明文并非指定大小的整数倍,因此在明文的最后一个分组需要将其填充至加密算法所要求的分组大小后进行加密。在解密时,按照同样的填充模式将填充的数据去除。

加密时填充,解密时删除,这就需要定一个规则,这个规则就是填充模式。

填充模式

NoPadding

不填充,在此填充下原始数据必须是分组大小的整数倍,非整数倍时无法使用该模式,会报错

PKCS5Padding / PKCS7Padding

填充至符合块大小的整数倍,填充值为填充数量数,需要填充7个字节,就全部填07

  • 原始:FF FF FF FF FF FF FF FF FF

  • 填充:FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

PKCS5Padding 的块大小应为 8 个字节,而 PKCS7Padding 的块大小可以在 1~255 的范围内。但 SunJCE 的 Provider 实现中 PKCS5Padding 也按 PKCS7Padding 来进行处理了。

有个细节,如果明文刚好是块的整数倍,也要加填充。

ISO10126Padding

填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节随机处理。

  • 原始:FF FF FF FF FF FF FF FF FF

  • 填充:FF FF FF FF FF FF FF FF FF 3F 7A B4 09 14 36 07

ISO7816-4Padding

填充至符合块大小的整数倍,填充值第一个字节为 0x80,其他字节填 0。

  • 原始:FF FF FF FF FF FF FF FF FF

  • 填充:FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00 00

ZeroBytePadding

填充至符合块大小的整数倍,填充值为 0

  • 原始:FF FF FF FF FF FF FF FF FF

  • 填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00

X923Padding

填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节填 0。

  • 原始:FF FF FF FF FF FF FF FF FF

  • 填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07

TBCPadding(Trailing-Bit-Compliment)

填充至符合块大小的整数倍,原文最后一位为“1”时填充 0x00,最后一位为“0”时填充“0xFF”。

  • 原始:FF FF FF FF FF FF FF FF FF

  • 填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00

  • 原始:FF FF FF FF FF FF FF FF F0

  • 填充:FF FF FF FF FF FF FF FF F0 FF FF FF FF FF FF FF

PKCS1Padding

该填充模式是 RSA 加密中使用的,详见 RFC 2313。RSA 加密时,需要将原文填充至密钥大小,填充的格式为:

00 + BT + PS + 00 + D

  • 00 为固定字节

  • BT 为处理模式。公钥操作时为 02,私钥操作为 00 或 01

  • PS 为填充字节,填充数量为 k - 3 - Dk 表示密钥长度,D 表示原文长度。PS 的最小长度为 8 个字节。填充的值根据 BT 值不同而不同:

    • BT = 00 时,填充全 00

    • BT = 01 时,填充全 FF

    • BT = 02 时,随机填充,但不能为 00

工作模式

ECB模式

ECB(Electronic CodeBook)模式,即电子密码本模式。该模式是将明文分组,加密后直接成为密文分组,分组之间没有关系。

ECB模式是所有模式中最简单的一种,该模式的明文分组与密文分组是一一对应的关系,若明文分组相同,其密文分组也一定相同。因此,ECB模式也是最不安全的模式。

可使用该模式测试一下输入与输出:

https://gchq.github.io/CyberChef

可以看到,明文重复的时候,密文也是重复的,后面的是填充。

CBC模式

CBC(Cipher Block Chaining)模式,即密码分组链接模式。该模式首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。只有第一个明文分组特殊,需要提前为其生成一个与分组长度相同的比特序列,进行XOR运算,这个比特序列称为初始化向量(Initialization Vector),简称IV

这里使用到了初始化向量。为了避免ECB模式引入的问题,使用初始化向量来随机化明文,然后将这种随机化传递下去。

CFB模式

CFB(Cipher FeedBack)模式,即密文反馈模式。该模式首先将前一个密文分组进行加密,再与当前明文分组进行XOR运算,来生成密文分组。同样CFB模式也需要一个IV。

OFB模式

OFB(Output FeedBack)模式,即输出反馈模式。该模式会产生一个密钥流,即将密码算法的前一个输出值,做为当前密码算法的输入值。该输入值再与明文分组进行XOR运行,计算得出密文分组。该模式需要一个IV,进行加密后做为第一个分组的输入。

CTR模式

CTR(CounTeR)模式,即计数器模式。该模式也会产生一个密钥流,它通过递增一个计数器来产生连续的密钥流。对该计数器进行加密,再与明文分组进行XOR运算,计算得出密文分组。

密文反馈(CFB,Cipher feedback)模式可以将块密码变为自同步的流密码。

输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。

CTR模式也可以将块密码变成流密码。

之前见过,流秘密的特性是明文长度等于密文,我们可以测试一下 CFB 模式:

可以自行尝试一下,发现输出与输入确实是一样长的。

参考资料

https://zh.wikipedia.org/wiki/分组密码工作模式

这篇关于常见加解密算法06 - 分组密码的填充与工作模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136219

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06