Java RSA密钥转换,从RSAPrivateKey得到RSAPublicKey

news2024/11/19 17:49:26

概述:

在Java编程中,我们经常用到如下一段代码来生成RSA公私钥,分别拿到公私钥然后加解密计算:

KeyPairGenerator keyPairGen;
keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048, new SecureRandom());
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

本文讲述仅有RSAPrivateKey privateKey,没有KeyPair keyPair,如何通过RSAPrivateKey privateKey得到RSAPublicKey publicKey

分析RSAPrivateKey:

RSAPrivateKey privateKey,通过函数privateKey.getAlgorithm()查看,或者通过privateKey.getEncoded()数据分析,可以得到默认是PKCS#8格式,
privateKey.getEncoded()的数据例子:

在这里插入图片描述
通过TLV分析工具查看:
在这里插入图片描述
在这里插入图片描述
可以看到,RSAPrivateKey privateKey里面,RSA密钥的参数N、E、D、P、Q等都包含在内的。
其中N、E是私钥对应的公钥RSAPublicKey publicKey,所需的全部参数。
因此,是可以从RSAPrivateKey privateKey拿到对应的RSAPublicKey publicKey

开发环境:

`IDE:eclipse版本4.20.0
编译器:JDK1.8
导入的包:bouncycastle,jar文件名bcprov-jdk18on-171.jar

转换函数:

public static byte[] p8PrvKey2P1PrvKeyBytes(PrivateKey privateKey) throws Exception {
      PrivateKeyInfo privateKeyInfo = PrivateKeyInfo.getInstance(privateKey.getEncoded());
       ASN1Encodable privateKeyPKCS1ASN1Encodable = privateKeyInfo.parsePrivateKey();
       ASN1Primitive asn1Primitive = privateKeyPKCS1ASN1Encodable.toASN1Primitive();        
       return asn1Primitive.getEncoded();
   } 
   	
public static RSAPublicKey rsaGetPubKeyFromPriKey(RSAPrivateKey privateKey) {
	RSAPublicKeySpec rsaPubKeySpec = null;
	KeyFactory keyFactory = null;
	org.bouncycastle.asn1.pkcs.RSAPrivateKey rP = null;

	try {
		keyFactory = KeyFactory.getInstance("RSA");
		rP = org.bouncycastle.asn1.pkcs.RSAPrivateKey.getInstance(p8PrvKey2P1PrvKeyBytes(privateKey));
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	try {
		keyFactory = KeyFactory.getInstance("RSA");
		rsaPubKeySpec = new RSAPublicKeySpec(rP.getModulus(), rP.getPublicExponent());
		return (RSAPublicKey) keyFactory.generatePublic(rsaPubKeySpec);
	} catch (InvalidKeySpecException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		return null;
	} catch (NoSuchAlgorithmException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		return null;
	}
}

注意导入bcprov-jdk18on-171.jar中类

import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;

还要注意,bouncycastle里面有RSAPrivateKey
jdk自带公共:java.security.interfaces.RSAPrivateKey;

bouncycastle包里面的:org.bouncycastle.asn1.pkcs.RSAPrivateKey

测试代码:

public static void main(String[] args) {		
	testRsa();
}

public static void testRsa() {
	KeyPairGenerator keyPairGen;
	try {
		keyPairGen = KeyPairGenerator.getInstance("RSA");
		
		keyPairGen.initialize(2048, new SecureRandom());
   
		KeyPair keyPair = keyPairGen.generateKeyPair();

		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
		
		//System.out.println("privateKey:" + hexToString(privateKey.getEncoded(), 0, privateKey.getEncoded().length));
		//RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
		RSAPublicKey publicKey = rsaGetPubKeyFromPriKey(privateKey);
		
		String out1 = encrypt("1234567890", publicKey);
		System.out.println("encrypt:" + out1);
		String out2 = decrypt(out1, privateKey);
		System.out.println("decrypt:" + out2);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}        
}


public static String encrypt(String str, RSAPublicKey publicKey) throws Exception {
	//base64编码的公钥
	//byte[] decoded = Base64.getDecoder().decode(publicKey);
	//RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
	//RSA加密
	Cipher cipher = Cipher.getInstance("RSA");
	cipher.init(Cipher.ENCRYPT_MODE, publicKey);
	String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));
	return outStr;
}
public static String decrypt(String str, RSAPrivateKey privateKey) throws Exception {
	//64位解码加密后的字符串
	byte[] inputByte = Base64.getDecoder().decode(str);
	//base64编码的私钥
	//byte[] decoded = Base64.getDecoder().decode(privateKey);
	//RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
	//RSA解密
	Cipher cipher = Cipher.getInstance("RSA");
	cipher.init(Cipher.DECRYPT_MODE, privateKey);
	String outStr = new String(cipher.doFinal(inputByte));
	return outStr;
}

测试结果:

在这里插入图片描述

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

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

相关文章

Oracle Instant Client + PLSQL 部署终端PC远程连接数据库服务器简易操作

系统环境: 1、win7_64bit 2、instantclient_21_10 3、plsqldev1105_x64 4、远程Oracle数据库:Oracle11g R2 操作步骤: 1、下载好Oracle Instant Client 和PLSQL程序安装包: 1.1 Oracle Instant Client 官网:https://w…

MySQL基础(五)排序与分页

1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序DESC(descend):降序 ORDER BY 子句在SELECT语句的结尾。 1.2 单列排序 SELECT last_name, job_id, department_id, hire_date FROM employees ORDER…

Redis之三大特殊数据类型:Geospatial:地理位置 hyperloglog:实现的功能是计算统计 bitmaps:位存储

三大特殊数据类型结构,十分的少见但是开源项目中依然有它们的身影 Geospatial:地理位置 实现的功能:附近的人,城市与城市之前的距离计算 添加城市经纬度到key中,经纬度则是key的value值,在正常的开发过程中&#xf…

获得 随机验证码(以图片为底层)

1:工具类 Slf4j public class RandomValidateCode {private static String baseNumLetter "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";private static String font "微软雅黑";//绘制验证码图片,返回验证码文本内容pu…

【机器学习】pytorch安装——环境配置(极简教程)

🥑 Welcome to Aedream同学 s blog! 🥑 文章目录 省流总结新建环境确定显卡型号安装显卡驱动安装pytorch国内镜像下载本地下载 验证安装成功 最近重新配置环境,简单记录一下。最近chatgpt等大语言模型和ai绘图火热,也为了方便很多…

视频剪辑必备的6个免费素材网站

做视频剪辑需要用到视频、音频、图片等素材,推荐几个网站,有免费、有付费,可根据需求自信选择~赶紧收藏起来! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种…

电视机顶盒哪个牌子好?数码小编盘点电视机顶盒排行榜

电视机顶盒哪个牌子好?这是困扰新手们的一大难题,部分产品被爆出虚标高配、偷工减料,面对众多的机顶盒品牌和型号,怎么选择才好?小编以销量和用户评价为标准,盘点了电视机顶盒排行榜,跟着我一起…

Web端3D轻量化引擎基于PBR渲染——仿真模拟更逼真

HOOPS Communicator在2021版本中,推出了基于PBR(Physically Based Rendering)的渲染特性以提供更高质量的渲染技术。 PBR将材料表示为一系列方程,这些方程对光如何从表面反射进行建模,再通过GPU上运行的着色器代码进行…

MySQL基础(二)MySQL环境搭建

. MySQL的卸载 步骤1:停止MySQL服务 在卸载之前,先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键,打开“任务管理器”对话框,可以在“服务”列表找到“MySQL8.0”的服务,如果现在“正在运行”状态&…

linux:命令grep查找关键字、wc统计以及管道符

linux:命令grep查找关键字、wc统计以及管道符 grep: wc: 输入wc test.txt时,输出了2 11 59 这三个数字 意思是:2行、11个单词(用空格分开就算一个单词)、59个字符(字节) ls -l看了看,也确实是59个字节。 通过wc的可选项来进行查看: 管道符…

成功解决:ubuntu下ifconfig不显示网卡信息

目录 前言方法一(临时)方法二第一步第二步第三步 前言 好久没动电脑虚拟机,今天打开ubuntu发现右上角没有网络图标,打开终端ping不同百度,再输入ifconfig发现不显示网卡信息,于是开始尝试各种方式&#xf…

11.软考——必考题型

1.必考题一------网络图 (1)完成项目的最少时间,肯定要最大最长的活动完成才算完成项目,因此找最长的路径:A->B->D->G->I->K->L 22天 (2)由于BD这条线就是处于最长的线,因此不能晚开始,晚开始就会导致整个项目都跟着晚。 (1)最长18 A--B…

Mysql 学习(八)单表查询方法二

复杂查询 上一节说了5种访问类型的查询,这一节就来说说关于这些比较复杂的查询 情况一:多个二级索引查询 sql:SELECT * FROM index_value_table WHERE value1 abc AND value2 > 1000;搜索条件: value1 等于 abcvalue2 大于…

tensorRT的完整安装以及常见错误 export failure: [WinError 127] 找不到指定的程序。

安装CUDA 查看本机适配的CUDA 版本 要想安装TensorRT必须要先安装CUDA和cudnn,那么首先需要去查看自己电脑的英伟达驱动程序程序,位置如下: NVIDIA控制面板->帮助->系统信息->组件,如下图所示本机适配CUDA版本为11.7 …

mongodb分片集群搭建

1.本次搭建使用三台centos7主机搭建伪集群,关闭防火墙和selinux服务 2.mongodb架构相当于9个分片节点,3个路由节点,3个配置节点,主机信息如下图所示 主机名称主机ip地址端口服务A10.1.60.11420001,21001,…

二叉树基本概念、种类、存储方式、遍历(JS实现)

📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录 二叉树基本概念性质 二叉树的种类满二叉树完全二叉树二叉搜索树平衡二叉搜…

问卷调查工具排行榜

问卷调查是从特定目标受众收集信息、意见和反馈的重要工具。随着技术的进步,市场上有许多问卷调查工具可供选择,这使得选择最适合您需求的工具变得具有挑战性。在本文中,我们将讨论一些可用的知名问卷调查工具。 1、Zoho Survey Zoho Surve…

看过这篇文章,读懂数据分析

一、为什么需要数据分析 数据分析的重要性不言而喻,没有数据,就是感性。数据不会被观点打败,数据只能被数据打败。我们现在妥妥地已经进入了数据时代。 量化IT投资成效,以数据驱动决策 站在公司或者决策者角度,数据最…

Smart Tools 网站的架构之美

本文将简要介绍Smart Tools工具箱网站的架构设计,带领大家一起领略架构之美。 Smart Tools是一款实用的在线工具箱网站,地址:https://smart-tools.cn 总体架构 Smart Tools工具箱网站是采用前后端分离的总体架构。其中,前端是由…

纯干货建议码住,新手写软文有哪些注意事项

随着互联网发展的越来越好,越来越的企业开始注重网络营销,软文营销就是其中的一种。软文营销对于很多企业来说无疑是非常具有优势的一种宣传方式。它可以帮助公司更优秀的传达其产品及服务的诉求,吸引潜在客户,加强品牌知名度&…