Java之3DES(Triple DES)加密计算(DESede/ECB/ZeroPadding)
Java环境本身并不直接支持DESede/ECB/ZeroPadding。
不过,可以通过以下几种方式来实现DESede/ECB/ZeroPadding:
- 手动实现填充和去除填充:如前面示例代码所示,在加密之前进行填充,在解密之后去除填充。这是一个通用的方法,可以应用于任何不支持特定填充方式的场景。
- 使用第三方库:有些第三方库可能会提供对不同填充方式的支持,比如Bouncy Castle。你可以检查最新版本的Bouncy Castle是否支持ZeroPadding,但通常情况下依然需要自己处理这个填充逻辑。
手动填充
package com.alited.project.gateway.sign;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import java.security.Security;
import java.util.Base64;/*** @author Wen先森* @version 1.0* @date 2024/6/13 14:21* @description: 手动补0*/
public class DesSign2 {public static void main(String[] args) throws Exception {Security.addProvider(new BouncyCastleProvider());// 自定义3DES密钥字符串(24字节长)String customKeyString = "123456789012345678901234"; // 24字节的密钥byte[] keyBytes = customKeyString.getBytes();// 根据密钥字符串生成SecretKey对象SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DESede");SecretKey secretKey = secretKeyFactory.generateSecret(new DESedeKeySpec(keyBytes));// 原始数据String originalData = "Hello, 3DES!";System.out.println("原始数据: " + originalData);// 加密String encryptedData = encrypt(originalData, secretKey);System.out.println("加密后数据: " + encryptedData);// 解密String decryptedData = decrypt(encryptedData, secretKey);System.out.println("解密后数据: " + decryptedData);}/*** 手动实现ZeroPadding*/private static byte[] zeroPad(byte[] data, int blockSize) {int paddingLength = blockSize - (data.length % blockSize);byte[] paddedData = new byte[data.length + paddingLength];System.arraycopy(data, 0, paddedData, 0, data.length);return paddedData;}/*** 去除ZeroPadding*/private static byte[] removeZeroPadding(byte[] data) {int i = data.length - 1;while (i >= 0 && data[i] == 0) {i--;}byte[] unpaddedData = new byte[i + 1];System.arraycopy(data, 0, unpaddedData, 0, i + 1);return unpaddedData;}/*** 加密方法*/public static String encrypt(String data, SecretKey key) throws Exception {Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding", "BC");cipher.init(Cipher.ENCRYPT_MODE, key);byte[] paddedData = zeroPad(data.getBytes(), cipher.getBlockSize());byte[] encryptedBytes = cipher.doFinal(paddedData);return Base64.getEncoder().encodeToString(encryptedBytes);}/*** 解密方法*/public static String decrypt(String data, SecretKey key) throws Exception {Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding", "BC");cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(data));byte[] unpaddedData = removeZeroPadding(decryptedBytes);return new String(unpaddedData);}
}
使用第三方库
首先,确保你已经在 Maven 项目中添加了 Bouncy Castle 的依赖:
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version>
</dependency>
然后使用第三方库自带的零填充方法
package com.alited.project.gateway.sign;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import java.security.Security;
import java.util.*;/*** @author Wen先森* @version 1.0* @date 2024/6/13 14:21* @description:*/
public class DesSign {public static void main(String[] args) throws Exception {Security.addProvider(new BouncyCastleProvider());// 自定义3DES密钥字符串(24字节长)String customKeyString = "123456789012345678901234"; // 24字节的密钥byte[] keyBytes = customKeyString.getBytes();// 根据密钥字符串生成SecretKey对象SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DESede");SecretKey secretKey = secretKeyFactory.generateSecret(new DESedeKeySpec(keyBytes));// 原始数据String originalData = "Hello, 3DES!";System.out.println("原始数据: " + originalData);// 加密String encryptedData = encrypt(originalData, secretKey);System.out.println("加密后数据: " + encryptedData);// 解密String decryptedData = decrypt(encryptedData, secretKey);System.out.println("解密后数据: " + decryptedData);}/*** 加密方法*/public static String encrypt(String data, SecretKey key) throws Exception {Cipher cipher = Cipher.getInstance("DESede/ECB/ZeroBytePadding", "BC");cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptedBytes = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}/*** 解密方法*/public static String decrypt(String data, SecretKey key) throws Exception {Cipher cipher = Cipher.getInstance("DESede/ECB/ZeroBytePadding", "BC");cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(data));return new String(decryptedBytes);}
}
相关文章:
Java之3DES(Triple DES)加密计算(DESede/ECB/ZeroPadding)
Java环境本身并不直接支持DESede/ECB/ZeroPadding。 不过,可以通过以下几种方式来实现DESede/ECB/ZeroPadding: 手动实现填充和去除填充:如前面示例代码所示,在加密之前进行填充,在解密之后去除填充。这是一个通用的方…...
从0开发一个Chrome插件:项目实战——广告拦截插件
前言 这是《从0开发一个Chrome插件》系列的第十七篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…...

C++ 32 之 静态成员函数
#include <iostream> #include <string> using namespace std;// 特点: // 1.在编译阶段就分配了内存空间 // 2.类内声明,在类外进行初始化 // 3.所有对象共享一份静态成员数据 class Students02{ public:int s_c;static int s_d;// 静态成员函数&#…...
Python闯LeetCode--第1题:两数之和
Problem: 1. 两数之和 文章目录 思路解题方法复杂度Code 思路 看到这道题第一思路就是暴力破解,枚举,两个for循环遍历,直到找到满足要求的答案。主要因题目假设只有一组满足结果的答案,因此难度大大降低,作为第一道题&…...

SSM情侣购物系统-计算机毕业设计源码02387
目 录 摘要 1 绪论 1.1 开发背景与意义 1.2开发意义 1.3Vue.js 主要功能 1.3论文结构与章节安排 2 情侣购物系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分…...

09-Spark架构
相比MapReduce僵化的Map与Reduce分阶段计算,Spark计算框架更有弹性和灵活性,运行性能更佳。 1 Spark的计算阶段 MapReduce一个应用一次只运行一个map和一个reduceSpark可根据应用复杂度,分割成更多的计算阶段(stage)…...

挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
目标 在清晨的代码编辑器上,一场新的挑战即将开始。程序员们肃立于安静的办公室,眼神专注地盯着屏幕,等待着编译器的一声提示。 随着编译器输出的激动人心的"start!"的提示,战斗的序幕拉开了。Bug如潮水般涌来&#x…...
浅谈JavaScript中的作用域
前言 今天就来简单聊聊JavaScript中的作用域吧!!! 正文 我们都知道,在任何一门编程语言里面都是有作用域这个概念的,不然岂不乱套了 在js中的作用域一共分为三种,全局域、函数域和块级作用域 全局域 全…...
Python | C++漂移扩散方程和无风险套利公式算法微分
🎯要点 🎯漂移扩散方程计算微分 | 🎯期权无风险套利公式计算微分 | 🎯实现图结构算法微分 | 🎯实现简单正向和反向计算微分 | 🎯实现简单回归分类和生成对抗网络计算微分 | 🎯几何网格计算微分…...

python如何对list求和
如何在Python中对多个list的对应元素求和,前提是每个list的长度一样。比如:a[1,2,3],b[2,3,4],c[3,4,5],对a,b,c的对应元素…...

如何解决mfc100u.dll丢失问题,关于mfc100u.dll丢失的多种解决方法
在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“计算显示缺失mfc100u.dll”。这个问题可能会影响到我们的正常使用,因此了解它的原因、表现以及解决方法是非常重要的。小编将详细介绍计算显示缺失mfc100u.dll的问题࿰…...

算法day32
第一题 207. 课程表 步骤一: 通过下图的课程数组,首先画出DAG图(有向无环图) 步骤二: 其次我们按照DAG图,来构建该图的拓扑排序,等有效的点都按照规则排完序后,观察是否有剩下的点的入度不为0&…...

【QT】信号与槽
目录 概述 Q_OBJECT 自定义信号 自定义槽 带参数的信号和槽 信号与槽断开 定义槽函数时,使用lambda表达式 概述 所谓的信号槽,要解决的问题,就是响应用户的操作,这是QT与其他GUI开发框架比较不同的地方。其他的GUI开发框…...

【Java】解决Java报错:IllegalArgumentException
文章目录 引言1. 错误详解2. 常见的出错场景2.1 非法的参数值2.2 空值或 null 参数2.3 非法的数组索引 3. 解决方案3.1 参数验证3.2 使用自定义异常3.3 使用Java标准库中的 Objects 类 4. 预防措施4.1 编写防御性代码4.2 使用注解和检查工具4.3 单元测试 结语 引言 在Java编程…...

完美的移动端 UI 风格让客户无可挑剔
完美的移动端 UI 风格让客户无可挑剔...
【React】在 React 组件中,怎么使用useContext
在React中,useContext 是一个Hook,它允许你无需显式地通过组件树的每一层来传递 props,就能将值深入到组件树的任何位置。要使用 useContext,你需要先创建一个 Context 对象,然后使用这个对象提供的 Provider 组件来包裹你的应用中的一部分。然后,任何在这个 Provider 下…...

【数据结构】栈的应用
目录 0 引言 1 栈在括号匹配中的应用 2 栈在表达式求值中的应用 2.1 算数表达式 2.2 中缀表达式转后缀表达式 2.3 后缀表达式求值 3 栈在递归中的应用 3.1 栈在函数调用中的作用 3.2 栈在函数调用中的工作原理 4 总结 0 引言 栈(Stack)是一…...

Opencv基本操作
Opencv基本操作 导入并使用opencv进行图像与视频的基本处理 opencv读取的格式是BGR import cv2 #opencv读取的格式是BGR import numpy import matplotlib.pyplot as plt %matplotlib inline图像读取 通过cv2.imread()来加载指定位置的图像信息。 img cv2.imread(./res/ca…...

2779. 数组的最大美丽值
简单翻译一下题目意思: 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]k] 区间中的任何数,区间左右是闭的。在每个数字可以替换的前提下,返回数组中最多的重复数字的数量。 第一想法是用一个哈希表,Key 是可以被替换的数…...
数据库修复实例(航线修复)
修复目标 修复回音群岛 (Echo Isles) 到 赞达拉港 (Port of Zandalar) 的航线 SET TRANSPORT_GUID : 32; SET TRANSPORT_ENTRY : 272677; SET CGUID : 850000;-- Adjust transports DELETE FROM transports WHERE guid TRANSPORT_GUID; INSERT INTO transports (guid, entry…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...