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));}
}

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

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

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

相关文章

C# Socket实际应用案例与属性详解

引言 Socket是一个在网络编程中非常常见和重要的概念&#xff0c;它提供了一种通信机制&#xff0c;使不同的计算机之间可以进行数据传输。本文将介绍C#中Socket的实际应用案例&#xff0c;并对Socket的常用属性进行详细解析。 文章目录 1. Socket的实际应用案例2. Socket的属…

SqlServer读写分离对等发布

SqlServer读写分离对等发布: 对等发布支持多主复制。发布服务器将事务流式传输到拓扑中的所有对等方。所有对等节点可以读取和写入更改,且所有更改将传播到拓扑中的所有节点。 注意点: 1.各服务器的数据库名字要保证一样。 2.发布名称必须保持一致。 3.各服务器必须都是…

【论文阅读】The Deep Learning Compiler: A Comprehensive Survey

论文来源&#xff1a;Li M , Liu Y , Liu X ,et al.The Deep Learning Compiler: A Comprehensive Survey[J]. 2020.DOI:10.1109/TPDS.2020.3030548. 这是一篇关于深度学习编译器的综述类文章。 什么是深度学习编译器 深度学习&#xff08;Deep Learning&#xff09;编译器将…

【Maven】让maven更高效,优化maven构建项目速度

打开idea的setting&#xff0c;找到maven&#xff0c;设置它多线程数&#xff0c;重启后即可&#xff01; 我这里是8&#xff0c;你们可以随便设置。 如下图&#xff1a;

Github git clone 和 git push 特别慢的解决办法

1.在本地上使用 SSH 命令无法git push 上传 github 项目 2.使用 git clone 下载项目特别慢总是加载不了 解决办法1 将 *** 的连接模式换成&#xff1a;D-i-r-e-c-t&#xff08;好像不太有用&#xff09; 后面再找找能不能再G-l-o-b-a-l 下解决该问题 解决办法 2 mac下直接设…

Spring Data【Spring Data Redis、Spring Data ElasticSearch】(二)-全面详解(学习总结---从入门到深化)

目录 四、 Spring Data Redis 五、 Spring Data ElasticSearch 四、 Spring Data Redis Redis 是一个基于内存的数据结构存储系统&#xff0c;它可以用作数据库或者缓存。它支持多种 类型的数据结构&#xff0c;这些数据结构类型分别为 String&#xff08;字符串&#xff09…

Flutter 开发者工具 Android Studio 开发Flutter应用

Flutter 开发者工具 在 Android Studio 开发Flutter应用 &#x1f525; Android Studio 版本更新 &#x1f525; Android Studio Check for Update Connection failed ​ 解决方案 如果是运行的是32位的android studio需要在andriod studio的启动目录下找到studio.exe.vmoptio…

WIZnet W5100S-EVB-Pico DHCP 配置教程(三)

DHCP协议介绍 什么是DHCP&#xff1f; 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用户IP地址进行动态管理和配置。 DHCP于1993年10月成为标准协议&#xff0c;其前身是BOOTP协议。DHCP协议由…

Python批量下载主播照片,实现人脸识别, 进行颜值评分,制作颜值排行榜

昨晚一回家&#xff0c;表弟就神神秘秘的跟我说&#xff0c;发现一个高颜值网站&#xff0c;非要拉着我研究一下她们的颜值高低。 我心想&#xff0c;这还得要我一个个慢慢看&#xff0c;太麻烦了~ 于是反手用Python给他写了一个人脸识别代码&#xff0c;把她们的照片全部爬下…

【TiDB理论知识 07】SQL执行流程

一 DML语句读写流程 1 DML语句读流程概要 用户发出SQL 被协议层接收 Protocal Layer 通过PD获取时间戳 parse模块 解析SQL&#xff0c;通过词法解析 与 语法解析 生成AST语法树 编译SQL Compile模块 ,区分点查 与 非点查&#xff0c;生成执行计划 发送给Executor,从TIKV获…

AAOS 音频焦点请求

文章目录 前言基本概念提供给应用来获取音频焦点的apiAAOS中的音频焦点管理交互矩阵duck的实现流程AAOS 测试应用kitchensink焦点相关 前言 本文章的目标是首先了解Android中音频焦点的基本概念&#xff0c;理解代码中相关音频焦点的使用方法。其次理解AAOS 中相关交互矩阵概念…

【Linux】Centos的一些快捷操作

Centos的一些快捷操作 一个窗口多个终端GVIM 一个窗口多个文件 一个窗口多个终端 GVIM 一个窗口多个文件

Hadoop学习指南:探索大数据时代的重要组成——Hadoop概述

前言 在当今大数据时代&#xff0c;处理海量数据成为了一项关键任务。Hadoop作为一种开源的分布式计算框架&#xff0c;为大规模数据处理和存储提供了强大的解决方案。本文将介绍Hadoop的组成和其在大数据处理中的重要作用&#xff0c;让我们一同踏上学习Hadoop的旅程。 Hado…

Jenkins集成SonarQube保姆级教程

Jenkins是自动化部署平台&#xff0c;一个粗眉大眼的糙汉子&#xff01; SonarQube是代码扫描平台&#xff0c;一个眉目清秀的小女子&#xff01; 有一天&#xff0c;上天交给我一个任务&#xff0c;去撮合撮合他们&#xff01; 我抬头看了看天&#xff0c; 不&#xff0c;…

2023-07-30 LeetCode每日一题(环形链表 II)

2023-07-30每日一题 一、题目编号 142. 环形链表 II二、题目链接 点击跳转到题目位置 三、题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 n…

Centos7中实现脚本使用mysqldump实现分库分表备份

脚本 #!/bash/bin userroot #用户名 password123456 #密码 back_path/backup/db databases_file/backup/databases.list [ -f $databases_file ] || touch /backup/databases.list if [[ ! -s ${databases_file} ]] then while read line do[ -d ${back_path}/$line ] …

【Python】数据分析+数据挖掘——探索Pandas中的数据筛选

1. 前言 当涉及数据处理和分析时&#xff0c;Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法&#xff0c;使得数据的选择、筛选和处理变得简单而高效。在本博客中&#xff0c;我们将重点介绍Pandas中数据筛选的关键知识点&#xff…

Git的.gitignore文件、标签管理以及给命令起别名

文章目录 1. 前言2. .gitignore文件3. 标签管理4. 给命令起别名 1. 前言 本文主要讲解Git中容易被忽略但比较重要一些知识:.gitignore文件、标签管理以及给命令起别名. 2. .gitignore文件 在新建仓库时,有一个添加.gitignore 模板: .gitignore 是一个用于指定 Git 忽略特定文…

第 356 场力扣周赛题解

A 满足目标工作时长的员工数目 签到题 class Solution { public:int numberOfEmployeesWhoMetTarget(vector<int> &hours, int target) {int res 0;for (auto x: hours)if (x > target)res;return res;} };B 统计完全子数组的数目 枚举子数组&#xff1a;枚举子数…

web-暴力破解密码

Burte Force&#xff08;暴力破解&#xff09;概述 暴力破解”是一攻击具手段&#xff0c;在web攻击中&#xff0c;一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录&#xff0c;直到得到正确的结果。 为了提高效率&…