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,即BC,其是一款开源的密码包,包含了大量的密码算法。 本篇主要演示BC库引入,对称加密算法AES、SM4和 非对称加密EC算法的简单实现,以下是实现过程。 一、将BC添加到JRE环境 前提:已安装JRE环…...
国内最大Llama开源社区发布首个预训练中文版Llama2
"7月31日,Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型,从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑,中文版Llama2一经发布将开启国内大模型新时代! | 全球最强,但中文短板…...
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代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
MongoDB文档--架构体系
阿丹: 在开始学习先了解以及目标知识的架构体系。就能事半功倍。 架构体系 MongoDB的架构体系由以下几部分组成: 存储结构:MongoDB采用文档型存储结构,一个数据库包含多个集合,一个集合包含多个文档。存储形式&#…...
GEE学习03-Geemap配置与安装,arcgis pro自带命令提示符位置等
跟着吴秋生老师的视频开展的学习,首先购买了云,用来设置全局。 1、尝试使用arcgis pro自带的conda conda env list查看电脑上环境,我自己电脑上有三个环境,使用的arcgis pro python克隆的环境作为的默认的环境 但是这样的前提…...
软件测试面试总结——http协议相关面试题
前言 在PC浏览器的地址栏输入一串URL,然后按Enter键这个页面渲染出来,这个过程中都发生了什么事?这个是很多面试官喜欢问的一个问题 如果测试只是停留在表面上点点点,不知道背后的逻辑,是无法发现隐藏的bug,只能找一…...
大数据与okcc呼叫中心融合的几种方式
在实际的生产实践中,为提高营销效率,避免骚扰大众,很多呼叫中心业务会与大数据平台进行合作,进行精准营销。 买卖数据是非法的,大数据平台方并不会提供直接的数据,一般情况下,提供的数据都是脱…...
WAF绕过-工具特征-菜刀+冰蝎+哥斯拉
WAF绕过主要集中在信息收集,漏洞发现,漏洞利用,权限控制四个阶段。 1、什么是WAF? Web Application Firewall(web应用防火墙),一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…...
使代码减半的5个Python装饰器
大家好,到目前为止,Python编程语言由于其语法简单,在机器学习和网络开发等各个领域的应用功能强大。除非绝对必要,装饰器一般很少出现在视野中,比如使用staticmethod装饰器来表示类中的静态方法。装饰器能提供的大量强…...
线程池的线程回收问题
首先,线程池里面分为核心线程和非核心线程。 核心线程是常驻在线程池里面的工作线程,它有两种方式初始化。 向线程池里面添加任务的时候,被动初始化主动调用prestartAllCoreThreads方法 当线程池里面的队列满了的情况下,为了增加…...
盘点那些不想骑车的原因和借口。
在自行车骑行的热潮中,我们都会找到各种千奇百怪的借口来解释我们为什么不想骑。本文将结合当前热点话题和趋势,从心理学、文化等多个角度,深入探讨这些借口背后的原因。 首先,我们不能忽视的是,骑行是一项需要耐力和毅…...
【深度学习Week3】ResNet+ResNeXt
ResNetResNeXt 一、ResNetⅠ.视频学习Ⅱ.论文阅读 二、ResNeXtⅠ.视频学习Ⅱ.论文阅读 三、猫狗大战Lenet网络Resnet网络 四、思考题 一、ResNet Ⅰ.视频学习 ResNet在2015年由微软实验室提出,该网络的亮点: 1.超深的网络结构(突破1000层&…...
Visual Studio 2022的MFC框架全面理解
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022开发工具下的MFC框架知识。 MFC(Microsoft Foundation Class,微软基础类库)是微软为了简化程序员的开发工作所开发的一套C类的集合…...
C# 消息队列 (MSMQ) 进程之间的通信
2个程序之间使用消息队列进行通信。 该代码只适用.NET Framework 版本,如果是.NET Core 请使用其他第三方消息队列框架,因为.NET Core 对System.Messaging 已经不支持呢。 进程1用于创建消息队列,然后发送消息。 代码如下: 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[…...
数字信号处理——频谱分析
数字信号处理——频谱分析 频谱分析 频谱分析是一种将复杂信号分解为较简单信号的技术。许多物理信号均可以表示为许多不同频率简单信号的和。找出一个信号在不同频率下的信息(如振幅、功率、强度或相位等)的做法即为频谱分析。 频谱 频谱是指一个时域…...
[软件工程] 架构映射战略设计方案模板
3 系统上下文 结合全局分析阶段获得的价值需求(利益相关者、系统愿景、系统范围)确定系统上下文,体现用户、目标系统与伴生系统之间的关系。 3.1 概述 绘制系统上下文图,明确解空间的系统边界。 3.2 系统协作业务流程1…n 根据全局…...
Springboot MongoDB 事务
目录 1. 事务和TransactionTemplate 2. 事务和MongoTransactionManager 3. 响应式事务 4. 事务和TransactionalOperator 5. 事务和ReactiveMongoTransactionManager 6. 事务内部的特殊行为 从版本4开始,MongoDB支持 事务。事务是建立在 会话之上的,…...
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 勾选相应字段-数据元素…...
刘教链|比特币税收漏洞即将关闭,稳定币却成最大赢家
一觉醒来,BTC小幅回升至67k一线。地区冲突阴云不散,加密市场始终承压。最近美国国会又出了个新草案,叫Digital Asset PARITY Act。名字听起来很公平,追求资产平等待遇,但仔细一看,这哪里是平等,…...
绿色软件制作:TranslucentTB便携版开发全攻略
绿色软件制作:TranslucentTB便携版开发全攻略 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 在Windows个性化定制领域&#…...
Qwen3.5-9B商业落地实践:电商客服图文理解+多轮需求确认系统
Qwen3.5-9B商业落地实践:电商客服图文理解多轮需求确认系统 1. 项目概述与核心价值 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,在电商客服场景中展现出强大的商业应用价值。该系统通过多模态理解和长上下文支持能力,能够同时处理文字和…...
3大核心突破:解密m4s-converter如何实现B站缓存视频的智能重生
3大核心突破:解密m4s-converter如何实现B站缓存视频的智能重生 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾面对B站缓存目…...
AIGC技术实操:AI生图、AI视频开发与工具集成
2026年,AIGC技术已从“玩具级应用”走向“产业级工具”,其中AI生图、AI视频成为开发者的热门布局领域,据统计,AIGC/传媒领域商业化进程最快,MCN行业人工智能渗透率超60%,广告行业渗透率达55%。对于开发者而…...
高性能Python爬虫数据预处理流水线:PyTorch 2.8与Dask并行计算实战
高性能Python爬虫数据预处理流水线:PyTorch 2.8与Dask并行计算实战 1. 爬虫数据处理的现实挑战 每天都有海量数据从互联网上被爬取下来,但很少有人告诉你这些原始数据有多"脏"。我曾经接手过一个电商评论分析项目,原始数据里混杂…...
OpenClaw龙虾推出官方中国镜像站,由字节跳动提供支持
文章目录前言龙虾是谁?为啥它搞个镜像站这么重要?中国镜像站来了:地址是 mirror-cn.clawhub.com背后的故事:腾讯、字节、龙虾的"三国演义"镜像站的意义:不只是个"加速器"怎么用?手把手…...
Phi-4-mini-reasoning vLLM参数详解:context_length=131072配置与性能调优
Phi-4-mini-reasoning vLLM参数详解:context_length131072配置与性能调优 1. 模型概述 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员,它特别针对数学推理…...
Vivado IOBUF原语使用避坑:为什么你的双向端口信号总连不上?
Vivado IOBUF原语深度解析:从原理到实战的双向端口设计指南 在FPGA开发中,双向端口(inout)的设计一直是工程师们容易踩坑的领域。特别是当我们需要将独立的输入输出信号合并为顶层inout端口时,Vivado提供的IOBUF原语看…...
离职见人品:软件测试工程师如何优雅交接,为职业生涯赋能
在职业旅程的每一次转折点,如何“结束”与如何“开始”同等重要。对于软件测试工程师而言,离职远非简单地提交代码、归还电脑那么简单。它更像是一次对个人职业素养、专业精神和人脉网络的集中检阅。一次专业、周到、负责任的交接,不仅能确保…...
