Java代码实现PKCS5填充

news2024/11/25 2:38:01

1. 前言

        如果你也在做加解密相关的需求,比如调用国密标准0018接口的对称加密/解密接口。就会遇到需要自己填充数据原文为16字节的整数倍(因为SM4分组算法的加密数据长度必须是其密钥大小的整数倍,SM4密钥大小是128bit,即:16字节)。

2. 代码实现

        下面两种实现的效果是一样的,只不过写法上有一些区别。

   2.1 PKCS5填充实现方式一

    /**
     * PKCS5填充方式一
     *
     * @param sourceData 原文数据对应的字节数组
     * @param blockSize  分组大小(比如国密SM4算法的分组大小是16字节)
     * @return
     */
    public byte[] PKCS5Padding_v1(byte[] sourceData, int blockSize) {
        int newLeng = (sourceData.length / blockSize + 1) * blockSize;
        byte[] ret = new byte[newLeng];
        System.arraycopy(sourceData, 0, ret, 0, sourceData.length);
        for (int i = sourceData.length; i < ret.length; ++i) {
            ret[i] = (byte) (ret.length - sourceData.length);
        }
        return ret;
    }

   2.2 PKCS5填充实现方式二

        

    /**
     * PKCS5填充方式二
     *
     * @param sourceData 原文数据对应的字节数组
     * @param blockSize  分组大小(比如国密SM4算法的分组大小是16字节)
     * @return
     */
    private byte[] PKCS5Padding_v2(byte[] sourceData, int blockSize) {
        int paddingLength = blockSize - (sourceData.length % blockSize);
        byte[] paddingBytes = new byte[paddingLength];
        for (int i = 0; i < paddingLength; i++) {
            paddingBytes[i] = (byte) paddingLength;
        }
        byte[] paddedTextBytes = new byte[sourceData.length + paddingLength];
        System.arraycopy(sourceData, 0, paddedTextBytes, 0, sourceData.length);
        System.arraycopy(paddingBytes, 0, paddedTextBytes, sourceData.length, paddingLength);
        return paddedTextBytes;
    }

 2.3 去除填充

    /**
     * 去除PKCS5填充
     *
     * @param tempPadData 已经填充后的数据
     * @param blockSize   分组大小(比如国密SM4算法的分组大小是16字节)
     * @return
     */
    public byte[] unPad(byte[] tempPadData, int blockSize) {
        int paddingLength = tempPadData[tempPadData.length - 1] & 0xFF;
        if (paddingLength > blockSize) {
            throw new IllegalArgumentException("Invalid padding length");
        }
        byte[] plainTextBytes = new byte[tempPadData.length - paddingLength];
        System.arraycopy(tempPadData, 0, plainTextBytes, 0, tempPadData.length - paddingLength);
        for (int i = 0; i < paddingLength; i++) {
            if (tempPadData[tempPadData.length - 1 - i] != paddingLength) {
                throw new IllegalArgumentException("Invalid padding value");
            }
        }
        return plainTextBytes;
    }

3. 测试验证

3.1 测试代码一

    @Test
    public void test10() {
        // 原文数据
        String str = "1";
        System.out.println("原文数据长度(byte):" + str.getBytes().length);

        // 使用PKCS5填充(方式一)
        byte[] b1 = PKCS5Padding_v1(str.getBytes(), 16);
        System.out.println("填充后的大小(byte):" + b1.length + "  填充后的数据(经过Base64编码):" + Base64.getEncoder().encodeToString(b1));

        // 使用PKCS5填充(方式二)
        byte[] b2 = PKCS5Padding_v2(str.getBytes(), 16);
        System.out.println("填充后的大小(byte):" + b1.length + "  填充后的数据(经过Base64编码):" + Base64.getEncoder().encodeToString(b2));

        System.out.println("-------去除PKCS5填充--------");
        byte[] bytes = unPad(b1, 16);
        System.out.println(new String(bytes));
    }

 

3.2 测试代码二

    @Test
    public void test10() {
        // 原文数据
        String str = "1236547899963214";
        System.out.println("原文数据长度(byte):" + str.getBytes().length);

        // 使用PKCS5填充(方式一)
        byte[] b1 = PKCS5Padding_v1(str.getBytes(), 16);
        System.out.println("填充后的大小(byte):" + b1.length + "  填充后的数据(经过Base64编码):" + Base64.getEncoder().encodeToString(b1));

        // 使用PKCS5填充(方式二)
        byte[] b2 = PKCS5Padding_v2(str.getBytes(), 16);
        System.out.println("填充后的大小(byte):" + b1.length + "  填充后的数据(经过Base64编码):" + Base64.getEncoder().encodeToString(b2));

        System.out.println("\n-------去除PKCS5填充,得到的原文数据--------");
        byte[] bytes = unPad(b1, 16);
        System.out.println(new String(bytes));
    }

 

3.3 测试代码三 

    @Test
    public void test10() {
        // 原文数据
        String str = "12365478999632141";
        System.out.println("原文数据长度(byte):" + str.getBytes().length);

        // 使用PKCS5填充(方式一)
        byte[] b1 = PKCS5Padding_v1(str.getBytes(), 16);
        System.out.println("填充后的大小(byte):" + b1.length + "  填充后的数据(经过Base64编码):" + Base64.getEncoder().encodeToString(b1));

        // 使用PKCS5填充(方式二)
        byte[] b2 = PKCS5Padding_v2(str.getBytes(), 16);
        System.out.println("填充后的大小(byte):" + b1.length + "  填充后的数据(经过Base64编码):" + Base64.getEncoder().encodeToString(b2));

        System.out.println("\n-------去除PKCS5填充,得到的原文数据--------");
        byte[] bytes = unPad(b1, 16);
        System.out.println(new String(bytes));
    }

如果此篇文章对你有帮助,感谢点个赞~~ 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mv_zhao直线

# 线段检测例程 # # 这个例子展示了如何在图像中查找线段。对于在图像中找到的每个线对象&#xff0c; # 都会返回一个包含线条旋转的线对象。# find_line_segments()找到有限长度的线&#xff08;但是很慢&#xff09;。 # Use find_line_segments()找到非无限的线&#xff08…

动态规划 —— 路径问题-最小路径和

1. 最小路径和 题目链接&#xff1a; 64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/minimum-path-sum/description/ 2. 算法原理 状态表示&#xff1a;以莫一个位置位置为结尾 dp[i&#xff0c;j]表示&#xff1a;到达[i&#xff0c;j…

利用GPU加速在Orange Pi 5上跑LLMs:人工智能爱好者High翻了!

本期视频将会给人工智能爱好者们带来超级震撼&#xff01; 视频中&#xff0c;我们将深入了解利用GPU加速在Orange Pi 5上跑LLMs的精彩世界。最近知乎上的一篇文章《利用GPU加速&#xff0c;在Orange Pi上跑LLMs》引起了我们的注意&#xff0c;这篇文章主要展示了GPU加速的LLM…

界面控件Kendo UI for Angular 2024 Q3亮点 - 全新的页面模板

随着最新的2024 Q3版本&#xff0c;Progress使用户能够使用现成的页面模板和构建块更快地构建令人惊叹的应用程序&#xff0c;使您的Telerik和Kendo UI开发体验更好。 Telerik和Kendo UI 2024 Q3版本将焦点放在新推出的页面模板和构建块上&#xff0c;每个页面模板和构建块都预…

鸿道Intewell操作系统架构介绍之Intewell-Hyper I 虚拟化构型

鸿道Intewell-Hyper I 虚拟化构型是鸿道Intewell-V虚拟化架构下的构型体系&#xff01;鸿道Intewell-V是科东软件自主研发的实时虚拟化操作系统&#xff0c;包括鸿道Intewell-Hyper I 和鸿道Intewell-Hyper II。鸿道Intewell-V可以实现多个操作系统在同一物理硬件上并行运行&am…

聊一聊Qt中的Slider和ProgressBar

目录 QAbstractSilder 主要属性 设置值 信号 其他功能 API QSlider 主要功能 控制刻度 信号 用户交互 键盘操作 API QProgressBar API QScrollBar 详细描述 QDial API 一个示例 Slider和ProgressBar从某种程度上都是反应了自己对目标控件的进度状态。在Qt中…

蓝牙BLE开发——红米手机无法搜索蓝牙设备?

解决 红米手机&#xff0c;无法搜索附近蓝牙设备 具体型号当时忘记查看了&#xff0c;如果你遇到有以下选项&#xff0c;记得打开~ 设置权限

讲一讲 kafka 的 ack 的三种机制?

大家好&#xff0c;我是锋哥。今天分享关于【K讲一讲 kafka 的 ack 的三种机制&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲一讲 kafka 的 ack 的三种机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka的消息确认机制&…

SpringFactoriesLoader

1.什么是SPI (面试题) SPI全名Service Provider interface&#xff0c;翻译过来就是“服务提供接口”&#xff0c;再说简单就是提供某一个服务的接口&#xff0c; 提供给服务开发者或者服务生产商来进行实现。 Java SPI 是JDK内置的一种动态加载扩展点的实现。 这个机制在一…

直接内存、死锁、方法句柄

直接内存 1. 不是虚拟机运行时数据区的一部分&#xff0c;也不是《Java虚拟机规范》中定义的内存区域 2. 直接内存是在Java堆外、直接向系统申请的内存区间 3. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 4. 通常&#xff0c;访问直接内存的速度会优于Java堆&am…

(七)JavaWeb后端开发1——Maven

目录 1.Maven概述 2.Maven依赖管理 2.1依赖配置 2.2依赖传递 2.3依赖范围 2.4生命周期 1.Maven概述 maven是一款管理和构建java项目的工具 Maven的作用&#xff1a; 依赖管理&#xff1a;方便快捷的管理项目依赖的资源(jar包)&#xff0c;避免版本冲突问题统一项目结构…

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用&#xff0c;需要通过网络来传输数据。传输协议可以有多种选择&#xff0c;但考虑到可靠性&#xff0c;一般默认采用TCP协议。为了屏蔽网络传输的复杂性&#xff0c;需要封装一个单独的数据传输模块用来收发二进制数据&#xff0c;这个单独模…

Web应用安全—信息泄露

从书本和网上了解到Web应用安全的信息泄露的知识&#xff0c;今天跟大家分享点。 robots.txt泄漏敏感信息 漏洞描述&#xff1a;搜索引擎可以通过robots文件可以获知哪些页面可以爬取&#xff0c;哪些页面不可以爬取。Robots协议是网站国际互联网界通行的道德规范&#xff0c…

二、Go快速入门之数据类型

&#x1f4c5; 2024年4月27日 &#x1f4e6; 使用版本为1.21.5 Go的数据类型 &#x1f4d6;官方文档&#xff1a;https://go.dev/ref/spec#Types 1️⃣ 布尔类型 ⭐️ 布尔类型只有真和假,true和false ⭐️ 在Go中整数0不会代表假&#xff0c;非零整数也不能代替真&#…

vue+element上传图片

一、html页面上传图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

22_快速diff算法

目录 处理相同的前置元素和后置元素处理相同的前置元素和后置元素-挂载处理相同的前置元素和后置元素-卸载判断是否需要进行 DOM 移动操作如何移动元素 处理相同的前置元素和后置元素 快速 diff 算法是需要经过预处理的&#xff0c;什么是预处理呢&#xff1f;我们来看一下下面…

Redis-事务、锁

文章目录 数据库的事务、锁介绍数据库的锁数据库的事务 Redis的事务介绍Redis的事务操作例子Redis的锁介绍1. 加锁2. 释放锁乐观锁和悲观锁悲观锁&#xff08;Pessimistic Locking&#xff09;乐观锁&#xff08;Optimistic Locking&#xff09;Redis中的锁机制 3. Redlock算法…

微服务基础拆分实践(第一篇)

目录 前言 一、认识微服务 1.1 单体架构 VS 微服务架构 1.2 微服务的集大成者&#xff1a;SpringCloud 1.3 微服务拆分原则 1.4 微服务拆分方式 二、微服务拆分入门步骤 &#xff1a;以拆分商品模块为例 三、服务注册订阅与远程调用&#xff1a;以拆分购物车为例 3.1 …

【NOIP普及组】 过河卒

【NOIP普及组】 过河卒 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 如图&#xff0c;A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走规则&#xff1a;可以向下、或者向右。同时在棋盘上的任一点有一个对方的马&#xff08;如上…

功能强大视频编辑软件 Movavi Video Editor Plus 2024 v24.2.0 中文特别版

Movavi Video Editor Plus中文修改版是一款功能强大的视频制作编辑软件&#xff0c;使用能够帮助用户快速从录制的素材中制作成一个精美的电影&#xff0c;支持进行视频剪辑&#xff0c;支持添加背影、音乐和各种音乐&#xff0c;软件使用简单&#xff0c;无需任何的经验和专业…