java pkcs7 和 pkcs5_PKCS7 / PKCS5 填充算法
PKCS7
PKCS7是当下各大加密算法都遵循的数据填充算法,且 OpenSSL 加密算法簇的默认填充算法就是 PKCS7。
AES-128, AES-192, AES-256 的数据块长度分别为 128/8=16bytes, 192/8=24bytes, 256/8=32bytes。
其实PKCS7理解起来非常简单,使用需填充长度的数值 paddingSize 所表示的ASCII码 paddingChar = chr(paddingSize)对数据进行冗余填充。
比如 AES-128的数据块长度是 16bytes,使用PKCS7进行填充时,填充的长度范围是 1 ~ 16。注意,当待加密数据长度为 16 的整数倍时,填充的长度反而是最大的,要填充 16 字节,为什么呢?因为 "PKCS7" 拆包时会按协议取最后一个字节所表征的数值长度作为数据填充长度,如果因真实数据长度恰好为 16 的整数倍而不进行填充,则拆包时会导致真实数据丢失。
为什么是冗余填充呢?因为即便你的数据长度符合blockSize的整数倍时,也需要填充,填充的长度反而是最大的,要填充blockSize个char(blockSize)字符在数据尾部,这样牺牲了数据长度的做法是为了更为灵活透明的去解包数据,发送端和接收端不需要约定好blockSize,接收端总能通过数据包的最后一个字符得到填充的数据长度。
当我们拿到一串PKCS7填充的数据时,取其最后一个字符paddingChar,此字符的ASCII码的十进制ord(paddingChar)即为填充的数据长度paddingSize,读取真实数据时去掉填充长度即可substr(content, 0, -paddingSize)。
填充示例,比如数据块blockSize为 8
h<0x07><0x07><0x07><0x07><0x07><0x07><0x07> 7
he<0x06><0x06><0x06><0x06><0x06><0x06> 6
hel<0x05><0x05><0x05><0x05><0x05> 5
hell<0x04><0x04><0x04><0x04> 4
hello<0x03><0x03><0x03> 3
hello <0x02><0x02> 2
hello w<0x01> 1
hello wo<0x08><0x08><0x08><0x08><0x08><0x08><0x08><0x08> 8 // 数据块
hello wor<0x07><0x07><0x07><0x07><0x07><0x07><0x07> 7
hello word<0x06><0x06><0x06><0x06><0x06><0x06> 6
实现:
/**
* PKCS7填充
* @param string $content 待填充内容
* @param int $block_size 待填充内容数据块长度
*/
function pkcs7_padding($content, $block_size)
{
if (255 < $block_size || 0 >= $block_size) {
throw new \Exception("the block size pkcs7 can padding is (0 ~ 255] ");
}
// 待填充的长度
$padding_size = $block_size - (strlen($content) % $block_size);
// 待填充的字符
$padding_char = chr($padding_size);
$content .= str_repeat($padding_char, $padding_size);
return $content;
}
/**
* 移除PKCS7
* @param string $content
* @return string
*/
function pkcs7_strip($content)
{
$padding_char = substr($content, -1);
$padding_size = ord($padding_char);
$content = substr($content, 0, -$padding_size);
return $content;
}
$content = pkcs7_padding("hello", $block_size);
echo pkcs7_strip($content);
PKCS5
pkcs5作为pkcs7的子集算法,概念上没有什么区别,只是在blockSize上固定为 8 bytes,即数据始终会被切割成 8 个字节的数据块,然后计算需要填充的长度。pkcs7的填充长度blockSize是 1~255 bytes。
java pkcs7 和 pkcs5_PKCS7 / PKCS5 填充算法相关推荐
- java实现种子填充算法,Java编写图形学的种子填充算法
用C写的图形学填充算法已经很多了,看到不少帖子都是在问关于如何用Java编写图形学的填充算法,说来也巧,我刚好要做一个这个方面的实验,用的是扫描线种子填充算法,由于时间仓促,代码质量可能不算很高,希望 ...
- java pkcs7 和 pkcs5_PKCS5Padding与PKCS7Padding的区别
工作中,我们常常会遇到跨语言平台的加密解密算法的交互使用,特别是一些标准的加解密算法,都设计到数据块Block与填充算法的 问题,例如C#与JAVA中的常见的填充算法如下: .Net中的填充算法: 成 ...
- Java边缘填充_任意画一个多边形,用边缘填充算法填充
任意画一个多边形,并用边(缘)填充算法进行填充.(多边形的顶点坐标存放在数组中,坐标值由键盘输入) #include #include //边缘填充 void draw(int a,int b){ f ...
- 图像处理------泛洪填充算法(Flood Fill Algorithm) 油漆桶功能
泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows paint的油漆桶功能.算法的原理很简单,就 ...
- 洪水填充算法_Android图像处理之泛洪填充算法
泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是windows paint的油漆桶功能.算法的原理很简单,就是 ...
- java快排算法解读,java 快排的思路与算法
java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...
- java常用的7大排序算法汇总
这段时间闲了下来,就抽了点时间总结了下java中常用的七大排序算法,希望以后可以回顾! 1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经 ...
- 边界填充算法讲解_边界填充算法
边界填充算法讲解 Boundary fill is the algorithm used frequently in computer graphics to fill a desired color ...
- OpenCV中泛洪填充算法解析与应用
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 泛洪填充(Flood Fill)很多时 ...
最新文章
- linux系统中安装java
- MyBatis实体属性与表的字段不对应的解决方案
- 网站改版都要注重哪些因素?
- Java将网络地址对应的图片转成本地的图片
- 解决 Windows 和 Ubuntu 时间不一致的问题--转载
- 3.07 检测两个表中是否有相同的数据
- linux机器光口和电口的区别,易天光通信SFP电口模块和10G SFP+电口模块介绍
- 视频播放加密功能的演示
- 电视动态测试软件,[4K演示] 你的电视能顶得住吗?精神污染MAX的SONY4K动态测试......
- IDEA中看代码时返回上一步快捷键(Mac)
- CuteHttpFileServer: 一键搭建文件共享服务器
- 程序员搞什么副业好?
- 安全芯片介绍-身份认证加密芯片方案
- Linux基本的键盘输入快捷键和一些常用命令
- div用css显示隐藏的效果
- prometheus 监控告警安装与设置
- Js日期函数-Date方法
- DHCP的工作原理及过程
- c语言采用文件存储数据,C语言读写文件大全 之 基础篇
- 主板下有螺母垫板的拧螺丝的CPU散热器,螺母垫板的固定一法