常见加解密算法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

相关文章

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化: