密码技术中填充模式解析

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

        常见的填充模式有:

1. NoPadding

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

2. PKCS5Padding / PKCS7Padding

        PKCS7Padding是当下各大加密算法都遵循的填充算法,且OpenSSL加密算法默认填充算法就是 PKCS7。

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

        假设每个区块大小为 blockSize:

  • 已对齐,填充一个长度为 blockSize 且每个字节均为 blockSize 的数据。

  • 未对齐,需要补充的字节个数为 n,则填充一个长度为 n 且每个字节均为 n 的数据。

        PKCS7PADDING 的块大小可以为 1~255 中任意值, PKCS5PADDING 是 PKCS7PADDING 的子集,块大小只能为固定值 8。

        假设:块大小为8 ,则PKCS7PADDING 和 PKCS5PADDING 是一样的。

        填充示例

        原始: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

        原始:FF FF FF FF FF FF FF FF 填充:FF FF FF FF FF FF FF FF 08 08 08 08 08 08 08 08 原文为整数倍也需要填充。

早期的PKCS#5 (一般指v2.0以及更早版本见rfc2898)确实只给出了block size等于8byte的情况,但要注意这些版本的PKCS#5也并没有用于AES,只是给出DES和RC2的加密标准(见RFC2898 6.1),AES的加密标准,如OpenSSL中的实现,都是用的PKCS#7,也是PKCS#5基础上的后继。

2017年提出的PKCS#5 v2.1(见rfc8018)才开始把AES/TDES/RC5也加进来,其中规定了AES用的是CMS(见rfc5652),即PKCS#7基础上做了一些修改的后续版本。

AES内容块大小为16byte,在不同的长度下需填充的字节个数可以为1到16个,对应的填充值为0x01到0x10。 也就是说在AES加密算法中,pkcs#5和pkcs#7是没有区别的。PKCS#5 只能padding 8byte这个说法也是错的。

        其实现算法如下:

#include <memory.h>
#include <string.h>
#include <stdio.h>

#define BLOCK_SIZE  16  //8

int pkcs7_padding(unsigned char *pSrcData, int iSrcDataLen, unsigned char *pDstData, int *iDstDataLen)
{
    int remainder = iSrcDataLen % BLOCK_SIZE;
    int padding   = BLOCK_SIZE - remainder;
    *iDstDataLen  = iSrcDataLen + padding;
    memcpy(pDstData, pSrcData, iSrcDataLen);
    memset(pDstData+ iSrcDataLen, padding, padding);
    return 0;
}

int pkcs7_strip(unsigned char *pSrcData, int iSrcDataLen, unsigned char *pDstData, int *iDstDataLen)
{
    int padding = pSrcData[iSrcDataLen - 1];
    int iLen = iSrcDataLen - padding;
    memcpy(pDstData, pSrcData, iLen);
    *iDstDataLen = iLen;
    return 0;
}

3. 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

4. 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

5. 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

6. X923Padding【ANSI X.923】

        填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节填 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

7. 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

8. PKCS1Padding

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

  • 00 为固定字节

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

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

  • BT = 00 时,填充全 00

  • BT = 01 时,填充全 FF

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/761322.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用热力图表示联邦学习场景中的客户端数据分布

用于生成热力图&#xff0c;记录过程&#xff0c;方便之后直接使用。 使用场景&#xff1a;联邦学习中显示客户端数据分布&#xff0c;或者显示数据分布的各类其他场景 文章目录 一、代码hot.py使用方法 二、参数解释三、样图关键词 一、代码 写这段代码时主要考虑联邦学习中显…

阿里云物联网应用层开发:第一部分,项目简介

文章目录 1、物联网应用层简介2、阿里云物联网应用层开发例程主要内容3、需要掌握基础知识 1、物联网应用层简介 应用层是物联网系统的用户界面&#xff0c;它提供了用户与系统交互的接口&#xff0c;这一层是将网络传输层的数据结果以易于理解和使用的方式呈现给用户&#xf…

在AvaotaA1全志T527开发板上使用 SSH 连接开发板

使用 SSH 连接开发板 启动系统 前提条件&#xff1a; 确保已经制作好AvaotaA1系统镜像至TF卡。 ​ 确保开发板电源供电正常&#xff1a;默认SPI显示屏有图案输出。 确保当前环境下有可以正常上网的路由器RJ45网线接口。 获取IP地址 如果想通过ssh去登陆开发板系统&#…

广义加性模型

简要介绍 在统计学中&#xff0c;广义加性模型&#xff08;GAM&#xff09;是一种广义线性模型&#xff0c;其中线性响应变量线性地依赖于一些预测变量的未知光滑函数&#xff0c;并且人们对这些光滑函数的推理很感兴趣。 GAM最初由Trevor Hastie和Robert Tibshirani[1]开发&…

数据写入流程,数据读取流程

理解客户端在HDFS上读、写数据的流程 数据写入流程 1. 客户端向NameNode发起请求 2. NameNode审核权限、剩余空间后&#xff0c;满足条件允许写入&#xff0c;并告知客户端写入的DataNode地址 3. 客户端向指定的DataNode发送数据包 4. 被写入数据的DataNode同时完成数据副本的…

mysql岗位实习----教务系统管理

教务管理系统 一、DDL CREATE TABLE users (user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID,username varchar(50) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,gender enum(男,女) NOT NULL COMMENT 性别,email varchar(100) DEFAULT N…

绿色算力|暴雨发布浸没式液冷服务器

随着数字经济的飞速发展和AI创新应用的不断突破&#xff0c;算力规模持续增长&#xff0c;最新发布的《数字中国发展报告&#xff08;2023年&#xff09;》显示&#xff0c;2023年中国算力总规模达到230EFLOPS&#xff0c;居全球第二位。 服务器作为算力基础设施底座&#xff…

spring中集成mybatis,并测试是否成功

首先你要配置pom.xml <!-- 连接 MySQL 数据库的驱动程序 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- spring-jdbc -->&…

OSRAM欧司朗XBO短弧氙灯160WHSXLOFR短弧氙灯450W

OSRAM欧司朗XBO短弧氙灯160WHSXLOFR短弧氙灯450W

【python012】Python根据页码处理PDF文件的内容

在日常工作和学习中&#xff0c;需要从PDF文件中提取特定页面的内容&#xff0c;以便进行知识、材料压缩等。 2.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&#xff01; 3.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起…

Java外卖点餐连锁店餐饮生鲜奶茶外卖店内扫码点餐源码同城外卖校园外卖源码

外卖点餐连锁店餐饮生鲜奶茶外卖小程序&#xff1a;打造一站式便捷服务 &#x1f680; 引领外卖新潮流&#xff1a;小程序的力量 在数字化时代&#xff0c;外卖小程序已成为餐饮行业的新宠。它不仅提供了便捷的点餐服务&#xff0c;还融合了连锁店、餐饮生鲜、奶茶等多种业务…

【机器学习】机器学习与医疗健康在疾病预测中的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在医疗健康中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 特征工程 1.2 模型选择1.2.1 逻辑回归1.2.2 决策树1.2.3 随机森林1.2.4 支持向量机1.2.5 神经网络 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化…

P4. 微服务: 匹配系统(下)

P4. 微服务: 匹配系统 下 0 概述1 游戏同步系统1.1 游戏同步的设计1.2 游戏同步的实现 2 匹配系统微服务的实现2.1 微服务概述2.2 匹配系统接口url的实现2.3 微服务之间的通信2.4 匹配逻辑的实现2.5 匹配系统的权限控制 3 bug的解决3.1 自己匹配自己3.2 断开连接问题 0 概述 本…

3403两个图像分析引擎差异

1.设置环境变量差异 2.获取数据大小差异 3.ATC差异

【EXCEL技巧】Excel如何将数字前面的0去掉

Excel文件中经常会遇到数据是0001345这种&#xff0c;那么&#xff0c;如何将数字前面的0去掉呢&#xff1f;今天和大家分享方法。 首先&#xff0c;选中一列空的单元格&#xff0c;然后在单元格中输入公式TEXT(D3,0)&#xff0c;这里的D3指的是前面带有0的数据的位置 回车之后…

Elasticsearch:Painless scripting 语言(一)

Painless 是一种高性能、安全的脚本语言&#xff0c;专为 Elasticsearch 设计。你可以使用 Painless 在 Elasticsearch 支持脚本的任何地方安全地编写内联和存储脚本。 Painless 提供众多功能&#xff0c;这些功能围绕以下核心原则&#xff1a; 安全性&#xff1a;确保集群的…

【征服数据结构】:期末通关秘籍

【征服数据结构】&#xff1a;期末通关秘籍 &#x1f498; 数据结构的基本概念&#x1f608; 数据结构的基本概念&#x1f608; 逻辑结构和存储结构的区别和联系&#x1f608; 算法及其特性&#x1f608; 简答题 &#x1f498; 线性表&#xff08;链表、单链表&#xff09;&…

RPC架构基本结构和核心技术

当你在构建一个分布式系统时&#xff0c;势必需要考虑的一个问题是&#xff1a;如何实现服务与服务之间高效调用&#xff1f;当然&#xff0c;你可以使用Dubbo或Spring Cloud等分布式服务框架来完成这个目标&#xff0c;这些框架帮助我们封装了技术实现的复杂性。那么&#xff…

【论文阅读】-- 研究时间序列可视化,提升用户体验

Investigating Time Series Visualisations to Improve the User Experience 摘要1 引言2 相关工作互动技巧视觉编码坐标系 3 用户研究时间序列可视化互动技巧任务实验设计 4 结果交互技术的效果视觉编码的影响坐标系的影响 5 讨论交互技术的效果视觉编码的影响坐标系的影响 6 …

[JS]正则表达式

介绍 正则表达式是定义匹配字符串的规则, 在JS中, 正则表达式也是对象, 通常用于查找或替换符合规则的文本 许多语言都支持正则表达式, 在前端中常见的场景就是表单验证和敏感词替换 语法 正则字面量 / / const str 好好学习,天天向上 // 1.定义规则: const reg /好///…