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

Java+bcprov库实现对称和非对称加密算法

BouncyCastle,即BC,其是一款开源的密码包,包含了大量的密码算法。
本篇主要演示BC库引入对称加密算法AES、SM4非对称加密EC算法的简单实现,以下是实现过程。

一、将BC添加到JRE环境

前提:已安装JRE环境,本地环境为jdk1.8

第一步、修改java.security文件

查找JDK安装位置,可执行 where javac
在这里插入图片描述
到 目录(D:\eclipse-ide\resource\java\jdk1.8.0_151\jre\lib\security)找到 java.security 文件,管理员方式打开,添加以下内容。

security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

添加位置和效果,如下图所示。
在这里插入图片描述

第二步、将BC的jar保添加到指定目录

即(D:\eclipse-ide\resource\java\jdk1.8.0_151\jre\lib\ext)下。
在这里插入图片描述

二、将BC库添加到项目

新建项目 -> 命名为 bcprovdemo,将 bcprov-ext-jdk15on-165.jar复制到项目的 lib文件下。
在这里插入图片描述
在 jar包右键-> Build Path -> Add to Build Patch ,将其添加到构建路径下
在这里插入图片描述
添加成功如下所示。
在这里插入图片描述

三、测试环境中 provider 是否正确

新建Java类-ProviderTest,使用到 security 包中的Provider和Security。

import java.security.Provider;
import java.security.Security;
import java.util.Map;public class ProviderTest {public static void main(String [] args) {// 添加BC库BouncyCastleProvider bcp = new BouncyCastleProvider();Security.addProvider(bcp);for(Provider p : Security.getProviders()) {System.out.println("当前遍历的p值为:"+ p);int cout = 1;for(Map.Entry<Object, Object> entry : p.entrySet()) {System.out.println("\t"+entry.getKey());cout++;if(cout>5)break;}}}
}

执行结果如下所示。
在这里插入图片描述
其打印的结果即 java.security 文件中的配置信息。
在这里插入图片描述

四、对称密钥生成
1)对称密钥算法 AES

AES可指定生成长度,默认为128,生成代码如下所示。

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import org.bouncycastle.util.encoders.Hex;
public class HexTest {void keyg() throws NoSuchAlgorithmException {SecureRandom sr = new SecureRandom();// 实例化KeyGenerator kg = KeyGenerator.getInstance("AES");// AES默认为128,三种长度 128192 256kg.init(192, sr);SecretKey sk = kg.generateKey();byte[] b = sk.getEncoded();System.out.println("密钥十六进制值为:" + Hex.toHexString(b));}// 调用密钥public static void main(String[] args) throws NoSuchAlgorithmException {HexTest ht = new HexTest();ht.keyg();}
}

结果如下图所示。
在这里插入图片描述

2)对称密钥 SM4算法

SM4算法 需要引入 BC库,其也可不指定长度,实现代码如下所示。

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;public class HexTest {void keyg() throws NoSuchAlgorithmException {// 添加BC库BouncyCastleProvider bcp = new BouncyCastleProvider();Security.addProvider(bcp);SecureRandom sr = new SecureRandom();// 实例化KeyGenerator kg = KeyGenerator.getInstance("SM4");// SM4 可不指定长度kg.init(sr);SecretKey sk = kg.generateKey();byte[] b = sk.getEncoded();System.out.println("SM4-密钥十六进制值为:" + Hex.toHexString(b));}// 调用密钥public static void main(String[] args) throws NoSuchAlgorithmException {HexTest ht = new HexTest();ht.keyg();}
}

控制台打印输出如下所示。
在这里插入图片描述

五、非对称密钥生成

非对称加密EC算法,引入BC库,其是以对出现,即公钥和私钥。实现代码如下所示。

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;public class KeyPairTest {public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException {// 添加BC库BouncyCastleProvider bcp = new BouncyCastleProvider();Security.addProvider(bcp);// 密钥对实例KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC");// KeyPairGenerator kpg = KeyPairGenerator.getInstance("RAS"); // 椭圆曲线// 初始化kpg.initialize(256);// 产生密钥对KeyPair key = kpg.genKeyPair();byte[] b = key.getPublic().getEncoded();// 公钥短,验证签名快System.out.println("生成的公钥为:" + Hex.toHexString(b));b = key.getPrivate().getEncoded();// 私钥长,验证签名慢System.out.println("生成的私钥为:" + Hex.toHexString(b));}
}

控制台打印输出如下所示。
在这里插入图片描述

相关文章:

Java+bcprov库实现对称和非对称加密算法

BouncyCastle&#xff0c;即BC&#xff0c;其是一款开源的密码包&#xff0c;包含了大量的密码算法。 本篇主要演示BC库引入&#xff0c;对称加密算法AES、SM4和 非对称加密EC算法的简单实现&#xff0c;以下是实现过程。 一、将BC添加到JRE环境 前提&#xff1a;已安装JRE环…...

国内最大Llama开源社区发布首个预训练中文版Llama2

"7月31日&#xff0c;Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型&#xff0c;从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑&#xff0c;中文版Llama2一经发布将开启国内大模型新时代&#xff01; | 全球最强&#xff0c;但中文短板…...

Qt应用开发(基础篇)——滑块类 QSlider、QScrollBar、QDial

目录 一、前言 二、QAbstractSlider类 1、invertedAppearance 2、invertedControls 3、maximum 4、minimum 5、orientation 6、pageStep 7、singleStep 8、sliderDown 9、tracking 10、sliderPosition 11、value 12、信号 三、QDial类 1、notchSize 2、notchTa…...

【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

MongoDB文档--架构体系

阿丹&#xff1a; 在开始学习先了解以及目标知识的架构体系。就能事半功倍。 架构体系 MongoDB的架构体系由以下几部分组成&#xff1a; 存储结构&#xff1a;MongoDB采用文档型存储结构&#xff0c;一个数据库包含多个集合&#xff0c;一个集合包含多个文档。存储形式&#…...

GEE学习03-Geemap配置与安装,arcgis pro自带命令提示符位置等

跟着吴秋生老师的视频开展的学习&#xff0c;首先购买了云&#xff0c;用来设置全局。 1、尝试使用arcgis pro自带的conda conda env list查看电脑上环境&#xff0c;我自己电脑上有三个环境&#xff0c;使用的arcgis pro python克隆的环境作为的默认的环境 但是这样的前提…...

软件测试面试总结——http协议相关面试题

前言 在PC浏览器的地址栏输入一串URL&#xff0c;然后按Enter键这个页面渲染出来&#xff0c;这个过程中都发生了什么事?这个是很多面试官喜欢问的一个问题 如果测试只是停留在表面上点点点&#xff0c;不知道背后的逻辑&#xff0c;是无法发现隐藏的bug&#xff0c;只能找一…...

大数据与okcc呼叫中心融合的几种方式

在实际的生产实践中&#xff0c;为提高营销效率&#xff0c;避免骚扰大众&#xff0c;很多呼叫中心业务会与大数据平台进行合作&#xff0c;进行精准营销。 买卖数据是非法的&#xff0c;大数据平台方并不会提供直接的数据&#xff0c;一般情况下&#xff0c;提供的数据都是脱…...

WAF绕过-工具特征-菜刀+冰蝎+哥斯拉

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…...

使代码减半的5个Python装饰器

大家好&#xff0c;到目前为止&#xff0c;Python编程语言由于其语法简单&#xff0c;在机器学习和网络开发等各个领域的应用功能强大。除非绝对必要&#xff0c;装饰器一般很少出现在视野中&#xff0c;比如使用staticmethod装饰器来表示类中的静态方法。装饰器能提供的大量强…...

线程池的线程回收问题

首先&#xff0c;线程池里面分为核心线程和非核心线程。 核心线程是常驻在线程池里面的工作线程&#xff0c;它有两种方式初始化。 向线程池里面添加任务的时候&#xff0c;被动初始化主动调用prestartAllCoreThreads方法 当线程池里面的队列满了的情况下&#xff0c;为了增加…...

盘点那些不想骑车的原因和借口。

在自行车骑行的热潮中&#xff0c;我们都会找到各种千奇百怪的借口来解释我们为什么不想骑。本文将结合当前热点话题和趋势&#xff0c;从心理学、文化等多个角度&#xff0c;深入探讨这些借口背后的原因。 首先&#xff0c;我们不能忽视的是&#xff0c;骑行是一项需要耐力和毅…...

【深度学习Week3】ResNet+ResNeXt

ResNetResNeXt 一、ResNetⅠ.视频学习Ⅱ.论文阅读 二、ResNeXtⅠ.视频学习Ⅱ.论文阅读 三、猫狗大战Lenet网络Resnet网络 四、思考题 一、ResNet Ⅰ.视频学习 ResNet在2015年由微软实验室提出&#xff0c;该网络的亮点&#xff1a; 1.超深的网络结构&#xff08;突破1000层&…...

Visual Studio 2022的MFC框架全面理解

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022开发工具下的MFC框架知识。 MFC(Microsoft Foundation Class&#xff0c;微软基础类库&#xff09;是微软为了简化程序员的开发工作所开发的一套C类的集合&#xf…...

C# 消息队列 (MSMQ) 进程之间的通信

2个程序之间使用消息队列进行通信。 该代码只适用.NET Framework 版本&#xff0c;如果是.NET Core 请使用其他第三方消息队列框架&#xff0c;因为.NET Core 对System.Messaging 已经不支持呢。 进程1用于创建消息队列&#xff0c;然后发送消息。 代码如下: using System; u…...

算法练习(4):牛客在线编程05 哈希

package jz.bm;import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet;public class bm5 {/*** BM50 两数之和*/public int[] twoSum (int[] numbers, int target) {int[] res new int[…...

数字信号处理——频谱分析

数字信号处理——频谱分析 频谱分析 频谱分析是一种将复杂信号分解为较简单信号的技术。许多物理信号均可以表示为许多不同频率简单信号的和。找出一个信号在不同频率下的信息&#xff08;如振幅、功率、强度或相位等&#xff09;的做法即为频谱分析。 频谱 频谱是指一个时域…...

[软件工程] 架构映射战略设计方案模板

3 系统上下文 结合全局分析阶段获得的价值需求&#xff08;利益相关者、系统愿景、系统范围&#xff09;确定系统上下文&#xff0c;体现用户、目标系统与伴生系统之间的关系。 3.1 概述 绘制系统上下文图&#xff0c;明确解空间的系统边界。 3.2 系统协作业务流程1…n 根据全局…...

Springboot MongoDB 事务

目录 1. 事务和TransactionTemplate 2. 事务和MongoTransactionManager 3. 响应式事务 4. 事务和TransactionalOperator 5. 事务和ReactiveMongoTransactionManager 6. 事务内部的特殊行为 从版本4开始&#xff0c;MongoDB支持 事务。事务是建立在 会话之上的&#xff0c…...

SAP自建表日志

文章目录 1.在表里加上日志记录字段1.1 加入日志结构1.2 在代码中调用记录日志通用函数1.3 在SM30里面记录日志1.4 缺点1.5 优点 2.表技术设置-日志数据更改2.1 RZ10或者RZ11修改系统参数2.2 设置表的属性2.3 查询日志2.4 缺点2.5 优点 3 SCDO文档对象3.1 勾选相应字段-数据元素…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

SQL进阶之旅 Day 22:批处理与游标优化

【SQL进阶之旅 Day 22】批处理与游标优化 文章简述&#xff08;300字左右&#xff09; 在数据库开发中&#xff0c;面对大量数据的处理任务时&#xff0c;单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”&#xff0c;深入探讨如何通过批量操作和游标技术提…...

二维数组 行列混淆区分 js

二维数组定义 行 row&#xff1a;是“横着的一整行” 列 column&#xff1a;是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...

基于django+vue的健身房管理系统-vue

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...