java使用bouncycastle加解密

jdk默认带了一些常见的加解密方式,当我们常见的加解密不能满足时,就需要用到一些第三方的库了,bouncycastle就是其中一种。

但是bouncycastle文档比较少。简单介绍一下写法

1.导入依赖

   <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.69</version></dependency>

2.写代码

常见的有两种方式,一种使用BouncyCastleProvider,另一种使用BlockCipherEngine

BouncyCastleProvider使用方式跟原生jdk类似,多数getInstance的地方指定一下provider就行

BouncyCastleProvider方式DES加解密代码如下

package com.vvvtimes.demo.util.endecrypt;import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.Key;
import java.security.NoSuchAlgorithmException;@Slf4j
public class BcDesUtil {private static final BouncyCastleProvider provider;//BouncyCastle与JDK加解密类区别//KeyFactory.getInstance("RSA"); +provider-->KeyFactory.getInstance("RSA", provider)//Cipher.getInstance("RSA");  +provider-->Cipher.getInstance("RSA", provider)//Signature.getInstance("SHA1withRSA"); +provider-->Signature.getInstance("SHA1withRSA", provider);//KeyGenerator.getInstance("DES") ; +provider-->KeyGenerator.getInstance("DES", provider); 或者KeyGenerator.getInstance("DES","BC")/*** 偏移变量,固定占8位字节*/private final static String IV_PARAMETER = "12345678";/** 生成key*/public byte[] generateKey() {KeyGenerator keyGenerator = null;try {keyGenerator = KeyGenerator.getInstance("DES",provider);keyGenerator.init(56);SecretKey secretKey = keyGenerator.generateKey();byte[] encoded = secretKey.getEncoded();return encoded;} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}/*** 生成key** @param password 密钥字符串* @return 密钥对象* @throws Exception*/private static Key convertKey(byte[] password) throws Exception {DESKeySpec dks = new DESKeySpec(password);SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES",provider);return keyFactory.generateSecret(dks);}/*** DES加密*/public static byte[] encrypt(byte[] data, byte[] password) {if (password == null || password.length < 8) {throw new RuntimeException("加密失败,key不能小于8位");}if (data == null)return null;try {Key secretKey = convertKey(password);Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding",provider);IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes("utf-8"));cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);byte[] bytes = cipher.doFinal(data);return bytes;} catch (Exception e) {e.printStackTrace();return data;}}/*** DES解密解密字符串*/public static byte[] decrypt(byte[] data, byte[] password) {if (password == null || password.length < 8) {throw new RuntimeException("加密失败,key不能小于8位");}if (data == null)return null;try {Key secretKey = convertKey(password);Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding",provider);IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes("utf-8"));cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);byte[] bytes = cipher.doFinal(data);return bytes;} catch (Exception e) {e.printStackTrace();return data;}}/*** byte数组转十六进制** @param bytes* @return*/public static String byte2HexString(byte[] bytes) {StringBuilder hex = new StringBuilder();if (bytes != null) {for (Byte b : bytes) {hex.append(String.format("%02X", b.intValue() & 0xFF));}}return hex.toString();}//测试public static void main(String[] args) throws Exception {String source = "admin测试信息1234!@#$%^&*()_+";System.out.println("原  文: " + source);String password = "lw112190@2023";byte[] encryptDataBytes = encrypt(source.getBytes("utf-8"), password.getBytes("utf-8"));String encryptData = byte2HexString(encryptDataBytes);System.out.println("加密后: " + encryptData);byte[] decryptDataBytes = decrypt(encryptDataBytes, password.getBytes("utf-8"));String decryptData = new String(decryptDataBytes, "utf-8");;System.out.println("解密后: " + decryptData);}static {provider = new BouncyCastleProvider();}
}

BlockCipherEngine方式的DES加解密代码如下

package com.vvvtimes.demo.util.endecrypt;import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.BufferedBlockCipher;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.DESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PKCS7Padding;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.DESParameters;
import org.bouncycastle.crypto.params.ParametersWithIV;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;public class BcDesEngineUtil {private final static BlockCipher engine;private static final BouncyCastleProvider provider;/*** 偏移变量,固定占8位字节*/private final static String IV_PARAMETER = "12345678";/*** 生成key** @param password 密钥字符串* @return 密钥对象* @throws Exception*/private static byte[] convertKeyEncoded(byte[] password) {byte[] result = null;try {DESKeySpec dks  = new DESKeySpec(password);SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES",provider);SecretKey secretKey = keyFactory.generateSecret(dks);return secretKey.getEncoded();} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();}return result;}private static byte[] encrypt( byte[] ptBytes,byte[] key) throws InvalidCipherTextException, UnsupportedEncodingException {BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(engine), new PKCS7Padding());cipher.init(true, new ParametersWithIV(new DESParameters(key), IV_PARAMETER.getBytes("utf-8")));byte[] rv = new byte[cipher.getOutputSize(ptBytes.length)];int tam = cipher.processBytes(ptBytes, 0, ptBytes.length, rv, 0);cipher.doFinal(rv, tam);return rv;}private static byte[] decrypt( byte[] cipherText,byte[] key) throws InvalidCipherTextException, UnsupportedEncodingException {BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(engine), new PKCS7Padding());cipher.init(false, new ParametersWithIV(new DESParameters( key),IV_PARAMETER.getBytes("utf-8")));byte[] rv = new byte[cipher.getOutputSize(cipherText.length)];int tam = cipher.processBytes(cipherText, 0, cipherText.length, rv, 0);cipher.doFinal(rv, tam);return rv;}/*** byte数组转十六进制** @param bytes* @return*/public static String byte2HexString(byte[] bytes) {StringBuilder hex = new StringBuilder();if (bytes != null) {for (Byte b : bytes) {hex.append(String.format("%02X", b.intValue() & 0xFF));}}return hex.toString();}//测试public static void main(String[] args) throws Exception {String source = "admin测试信息1234!@#$%^&*()_+";System.out.println("原  文: " + source);String password = "lw112190@2023";//String password ="geffzhan";//String password ="lw112190";byte[] keyEncoded = convertKeyEncoded(password.getBytes("utf-8"));byte[] encryptDataBytes = encrypt(source.getBytes("utf-8"), keyEncoded);String encryptData = byte2HexString(encryptDataBytes);System.out.println("加密后: " + encryptData);byte[] decryptDataBytes = decrypt(encryptDataBytes, keyEncoded);String decryptData = new String(decryptDataBytes, "utf-8");;System.out.println("解密后: " + decryptData);/**原  文: admin测试信息1234!@#$%^&*()_+加密后: 1D5C21B694A9085A69BE7EA37C197D1632239545298613B944C3AC272750A519F66FB43EFEC55C89解密后: admin测试信息1234!@#$%^&*()_+*/}static {engine = new DESEngine();provider = new BouncyCastleProvider();}}

3.其他示例

AES加解密

package com.vvvtimes.demo.util.endecrypt;import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidParameterSpecException;@Slf4j
public class BcAesUtil {private static final BouncyCastleProvider provider;/*** 偏移变量,固定占8位字节*/private final static String IV_PARAMETER = "1234567890123456";/*** AES加密*/public static byte[] encrypt(byte[] data, byte[] password, byte[] iv) {if (data == null)return null;try {Key secretKey = new SecretKeySpec(password,"AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding",provider);AlgorithmParameters generateIV = generateIV(iv);cipher.init(Cipher.ENCRYPT_MODE, secretKey, generateIV);byte[] bytes = cipher.doFinal(data);return bytes;} catch (Exception e) {e.printStackTrace();return data;}}/*** AES解密解密字符串*/public static byte[] decrypt(byte[] data, byte[] password, byte[] iv) {if (data == null)return null;try {Key secretKey = new SecretKeySpec(password,"AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding",provider);AlgorithmParameters generateIV = generateIV(iv);cipher.init(Cipher.DECRYPT_MODE, secretKey, generateIV);byte[] bytes = cipher.doFinal(data);return bytes;} catch (Exception e) {e.printStackTrace();return data;}}public static AlgorithmParameters generateIV(byte[] iv){AlgorithmParameters params = null;try {params = AlgorithmParameters.getInstance("AES");params.init(new IvParameterSpec(iv));} catch (NoSuchAlgorithmException | InvalidParameterSpecException e) {e.printStackTrace();}return params;}/*** byte数组转十六进制** @param bytes* @return*/public static String byte2HexString(byte[] bytes) {StringBuilder hex = new StringBuilder();if (bytes != null) {for (Byte b : bytes) {hex.append(String.format("%02X", b.intValue() & 0xFF));}}return hex.toString();}//测试public static void main(String[] args) throws Exception {String source = "admin测试信息1234!@#$%^&*()_+";System.out.println("原  文: " + source);String password = "passwordpassword";byte[] encryptDataBytes = encrypt(source.getBytes("utf-8"), password.getBytes("utf-8"),IV_PARAMETER.getBytes("utf-8"));String encryptData = byte2HexString(encryptDataBytes);System.out.println("加密后: " + encryptData);byte[] decryptDataBytes = decrypt(encryptDataBytes, password.getBytes("utf-8"),IV_PARAMETER.getBytes("utf-8"));String decryptData = new String(decryptDataBytes, "utf-8");System.out.println("解密后: " + decryptData);}static {provider = new BouncyCastleProvider();}
}

RSA私钥解密 签名

package com.vvvtimes.demo.util.endecrypt;import cn.hutool.core.codec.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.nio.charset.Charset;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;public class BcRsaUtil {private static final BouncyCastleProvider provider;private static PrivateKey getPrivateKey(String pkcs8Key) {byte[] pkcs8Keybytes = Base64.decode(pkcs8Key.getBytes(Charset.forName("UTF-8")));final PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(pkcs8Keybytes);try {return KeyFactory.getInstance("RSA", provider).generatePrivate(pkcs8EncodedKeySpec);} catch (Exception ex) {ex.printStackTrace();return null;}}/*** RSA私钥解密** @param inputByte 待解密字节数组* @param pkcs8Key  私钥* @return 明文*/public static byte[] decrypt(byte[] inputByte, String pkcs8Key) {byte[] outputeByte = null;try {PrivateKey privateKey = getPrivateKey(pkcs8Key);//RSA解密Cipher cipher = Cipher.getInstance("RSA", provider);cipher.init(Cipher.DECRYPT_MODE, privateKey);outputeByte = cipher.doFinal(inputByte);} catch (NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | NoSuchAlgorithmException e) {e.printStackTrace();}return outputeByte;}public static byte[] sign(final byte[] array, String pkcs8Key) {try {PrivateKey privateKey = getPrivateKey(pkcs8Key);final Signature instance = Signature.getInstance("SHA1withRSA", provider);instance.initSign(privateKey);instance.update(array);return instance.sign();} catch (GeneralSecurityException ex) {throw new RuntimeException("License Server installation error 0000000F2", ex);}}static {provider = new BouncyCastleProvider();}
}

实际上bouncycastle还支持部分国密算法,这一部分不用自己写实现了。

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

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

相关文章

5 ip的分配

如上一节所述&#xff0c;需要和其他设备通信&#xff0c;那么需要先配置ip. 1、如何配置ip 1.可以使用 ifconfig&#xff0c;也可以使用 ip addr 2.设置好了以后&#xff0c;用这两个命令&#xff0c;将网卡 up 一下&#xff0c;就可以了 //---------------------------- 使…

AI大模型时代网络安全攻防对抗升级,瑞数信息变革“下一代应用与数据安全”

AI与大模型技术加速普及&#xff0c;安全领域也在以创新视角聚焦下一代应用安全WAAP变革&#xff0c;拓展新一代数据安全领域。近日瑞数信息重磅发布了瑞数全新API扫描器、API安全审计、数据安全检测与应急响应系统及分布式数据库备份系统四大新品。此次发布在延续瑞数信息Bot自…

用java代码实现QQ第三方登录

QQ第三方登录需要使用到QQ互联开放平台提供的API&#xff0c;在Java中可以使用OAuth2.0协议来实现第三方登录。 具体实现步骤如下&#xff1a; 注册QQ互联开放平台账号&#xff0c;并创建应用&#xff0c;获取到App ID和App Secret。 在Java项目中导入QQ互联开放平台提供的Ja…

当zmq 和 docker 都要绑定一个端口时,怎么不修改端口号就能解决冲突?

问题描述 docker容器中的程序需要和外部进行通讯&#xff0c;但是当作为请求方向 响应方发送数据时&#xff0c;外部的进程因为需要绑定的端口被docker占用而绑定失败。 解决方式 方式一&#xff1a;使用请求响应方式&#xff0c;但是将响应端放置到容器内部。 方拾二&#…

freertos简单串口

先来完善一下FreeRTOSConfig.h这个配置文件 /*FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.All rights reservedVISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.This file is part of the FreeRTOS distribution.FreeRTOS is …

vue3+ts+vite搭建项目

检查node版本 > node -v检查vue版本 > vue -V1、全局安装Vue CLI 3.X版本 > npm install -g vue/cli2、创建vue 项目 > vue create [project-name]3、安装vite > npm install vite4、使用vite Vite 需要 Node.js 版本 > 12.0.0。 > npm init vitela…

通信原理板块——时域均衡

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、均衡器 为了减小码间串扰的影响…

放卷开环张力控制(伺服转矩模式应用)

收放卷张力开环闭环控制算法,请参考下面文章链接: PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-CSDN博客文章浏览阅读4k次,点赞3次,收藏3次。里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算…

Scala和Play WS库编写的爬虫程序

使用Scala和Play WS库编写的爬虫程序&#xff0c;该程序将爬取网页内容&#xff1a; import play.api.libs.ws._ import scala.concurrent.ExecutionContext.Implicits.global ​ object BaiduCrawler {def main(args: Array[String]): Unit {val url ""val proxy…

CMake教程-第 12 步:打包调试和发布

CMake教程-第 12 步&#xff1a;打包调试和发布 1 CMake教程介绍2 学习步骤[Step 1: A Basic Starting Point](https://blog.csdn.net/u014100559/article/details/133099915?spm1001.2014.3001.5501)[Step 2: Adding a Library](https://blog.csdn.net/u014100559/article/de…

【学习笔记】[COCI2018-2019#1] Teoretičar

首先&#xff0c;可以发现 C C C等于所有点度数的最大值&#xff0c;我们能用到的颜色数目为 2 x ≥ C 2^x\ge C 2x≥C。 考虑分治&#xff0c;将边集划分为 E E 1 E 2 EE_1E_2 EE1​E2​&#xff0c;使得 E 1 , E 2 E_1,E_2 E1​,E2​中点度数的最大值都不超过 2 x − 1 2^…

06.Oracle数据备份与恢复

Oracle数据备份与恢复 一、通过RMAN方式备份二、使用emp/imp和expdb/impdb工具进行备份和恢复三、使用Data guard进行备份与恢复 一、通过RMAN方式备份 通过 RMAN&#xff08;Oracle 数据库备份和恢复管理器&#xff09;方式备份 Oracle 数据库&#xff0c;可以使用以下步骤&a…

网速和带宽浅析

经常会对交换机的带宽和文件的存储的单位混淆不清&#xff0c;下面进行整理分析。 1、网速 网速是通俗的叫法&#xff0c;专业的叫法是带宽。如手机上显示的网速为2.4K/s。 带宽通常有十兆、百兆、千兆&#xff0c;即10Mbps、100Mbps、1000Mbps&#xff0c;单位为bps。 2、带…

【微服务】mysql + elasticsearch数据双写设计与实现

目录 一、前言 二、为什么使用mysqles双写 2.1 单用mysql的问题 2.2 为什么不直接使用es 2.2.1 非关系型表达 2.2.2 不支持事务 2.2.3 多字段将造成性能低下 三、mysqles双写方案设计要点 3.1 全新设计 VS 中途调整架构 3.2 全表映射 VS 关键字段存储 3.2.1 最大程度…

FPGA高端项目:图像采集+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP …

js原型链

什么叫原型链 原型链是js中的核心&#xff0c;原型链将各个属性链接起来&#xff0c;在原型链上面定义&#xff0c;原型链上的其他属性能够使用&#xff0c;原型链就是保证继承 原型链区分 原型链分为显式原型和隐式原型 显式原型&#xff1a;只有函数和构建函数才有显式原型…

spring面试题笔记

SpringBoot 有几种读取配置文件的方式 1.value 必须是bean里才能生效&#xff0c;&#xff0c;final或static无法生效 2ConfigurationProperties注解 ConfigurationProperties是springboot提供读取配置文件的一个注解 注意&#xff1a; 前缀定义了哪些外部属性将绑定到类的字…

【GPT4账号】ChatGPT/GPT4科研技术应用与AI绘图及论文高效写作

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车&#xff0c;就有可能被淘汰在这个数字化时代&#xff0c;如何能高效地处理文本、文献查阅、PPT…

【左程云算法全讲2】链表、栈、队列、递归、哈希表和有序表

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

day9-操作系统初始化函数init-2

1.内核如何进行多平台的适配&#xff0c;在内核中是如何认识这些板子的&#xff1f;结构体 machine_desc 2.内核启动的整体流程 3.认识一种高效的编程结构 链接脚本:vmlinux.lds.S .init.arch.info : { __arch_info_begin .; *(.arch.info.init) /…