当前位置: 首页 > news >正文

Java之3DES(Triple DES)加密计算(DESede/ECB/ZeroPadding)

Java环境本身并不直接支持DESede/ECB/ZeroPadding。
不过,可以通过以下几种方式来实现DESede/ECB/ZeroPadding:

  1. 手动实现填充和去除填充:如前面示例代码所示,在加密之前进行填充,在解密之后去除填充。这是一个通用的方法,可以应用于任何不支持特定填充方式的场景。
  2. 使用第三方库:有些第三方库可能会提供对不同填充方式的支持,比如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。 不过&#xff0c;可以通过以下几种方式来实现DESede/ECB/ZeroPadding&#xff1a; 手动实现填充和去除填充&#xff1a;如前面示例代码所示&#xff0c;在加密之前进行填充&#xff0c;在解密之后去除填充。这是一个通用的方…...

从0开发一个Chrome插件:项目实战——广告拦截插件

前言 这是《从0开发一个Chrome插件》系列的第十七篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…...

C++ 32 之 静态成员函数

#include <iostream> #include <string> using namespace std;// 特点: // 1.在编译阶段就分配了内存空间 // 2.类内声明&#xff0c;在类外进行初始化 // 3.所有对象共享一份静态成员数据 class Students02{ public:int s_c;static int s_d;// 静态成员函数&#…...

Python闯LeetCode--第1题:两数之和

Problem: 1. 两数之和 文章目录 思路解题方法复杂度Code 思路 看到这道题第一思路就是暴力破解&#xff0c;枚举&#xff0c;两个for循环遍历&#xff0c;直到找到满足要求的答案。主要因题目假设只有一组满足结果的答案&#xff0c;因此难度大大降低&#xff0c;作为第一道题&…...

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分阶段计算&#xff0c;Spark计算框架更有弹性和灵活性&#xff0c;运行性能更佳。 1 Spark的计算阶段 MapReduce一个应用一次只运行一个map和一个reduceSpark可根据应用复杂度&#xff0c;分割成更多的计算阶段&#xff08;stage&#xff09;…...

挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构

目标 在清晨的代码编辑器上&#xff0c;一场新的挑战即将开始。程序员们肃立于安静的办公室&#xff0c;眼神专注地盯着屏幕&#xff0c;等待着编译器的一声提示。 随着编译器输出的激动人心的"start!"的提示&#xff0c;战斗的序幕拉开了。Bug如潮水般涌来&#x…...

浅谈JavaScript中的作用域

前言 今天就来简单聊聊JavaScript中的作用域吧&#xff01;&#xff01;&#xff01; 正文 我们都知道&#xff0c;在任何一门编程语言里面都是有作用域这个概念的&#xff0c;不然岂不乱套了 在js中的作用域一共分为三种&#xff0c;全局域、函数域和块级作用域 全局域 全…...

Python | C++漂移扩散方程和无风险套利公式算法微分

&#x1f3af;要点 &#x1f3af;漂移扩散方程计算微分 | &#x1f3af;期权无风险套利公式计算微分 | &#x1f3af;实现图结构算法微分 | &#x1f3af;实现简单正向和反向计算微分 | &#x1f3af;实现简单回归分类和生成对抗网络计算微分 | &#x1f3af;几何网格计算微分…...

python如何对list求和

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

如何解决mfc100u.dll丢失问题,关于mfc100u.dll丢失的多种解决方法

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

算法day32

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

【QT】信号与槽

目录 概述 Q_OBJECT 自定义信号 自定义槽 带参数的信号和槽 信号与槽断开 定义槽函数时&#xff0c;使用lambda表达式 概述 所谓的信号槽&#xff0c;要解决的问题&#xff0c;就是响应用户的操作&#xff0c;这是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 引言 栈&#xff08;Stack&#xff09;是一…...

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. 数组的最大美丽值

简单翻译一下题目意思&#xff1a; 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]k] 区间中的任何数&#xff0c;区间左右是闭的。在每个数字可以替换的前提下&#xff0c;返回数组中最多的重复数字的数量。 第一想法是用一个哈希表&#xff0c;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…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...