Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对)

1、openssl生成RSA公私钥对

[root@loaclhost ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017#生成RSA私钥:
[root@loaclhost ~]# openssl
OpenSSL> genrsa -out rsa_private_key.pem 1024
Generating RSA private key, 1024 bit long modulus
...........................................................++++++
.......++++++
e is 65537 (0x10001)
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform pem -nocrypt -out rsa_private_key_8.pem
#生成RSA公钥
OpenSSL> rsa -in rsa_private_key_8.pem -pubout -out rsa_public_key.pem

公钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDeOvgowlgzAiPdIdBsFK5Yk9dH
B3BXQa1IieIkRbxC7ZGYiXJELbzHi5vcmmFuadKQBA1BltR3yNdIptRM9/NRQtVo
e+kuFIU1X/MgFhIGlP4O56LL5L8RqOg8yj/EOJzYBU7ioMZX6f2uDjCJ0s7Nx45y
/cr9RQJZbv5WAx4YyQIDAQAB
-----END PUBLIC KEY-----

私钥:

-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN46+CjCWDMCI90h
0GwUrliT10cHcFdBrUiJ4iRFvELtkZiJckQtvMeLm9yaYW5p0pAEDUGW1HfI10im
1Ez381FC1Wh76S4UhTVf8yAWEgaU/g7nosvkvxGo6DzKP8Q4nNgFTuKgxlfp/a4O
MInSzs3HjnL9yv1FAllu/lYDHhjJAgMBAAECgYAZqZWen1KwET8y+gSndnvrnqbt
fN5sNRldlw6WQbdLw0Nc6gJX/TAfmu+Uuf8mUPIPz2f4ewJuErNJoHpDqR5fvLeP
YQNdJNKFK3wSqc58pMBkABMJEod94RbTEgDtC8FRZUbz98IUVMTwByLrRqgoZqAW
3XYU9zaYdj5QzNvvQQJBAP14trvc3DwkNq3YwJ+iJfsYbTJ21nNyYaJkUx2sb43p
KPOdpx+dmmlkk+uRYdJK9eLp+0m4LsARYfGR1Vrm2UcCQQDgcnm2wSbPuwqrkPbO
njRhtbUtFgAUMIevOAAbZEa1CmBeQ5eOfDirlSa3W/ZtL3GkfZWNv+rBKuOSTWoW
vIVvAkEAyz4uGDkihz7qcT+qRNY56jtN4/cSQgPncdVMKDEKSho5cg5p4Zn4JKY3
Td6HN55Px6GikxwSsIO/q3oqP/d3JQJAP+mZKydZS/HxGeXPwgpe1CwQCWSoZRdk
q8qAjUxCri7kPjN1JsfMw19XhQMU6waFj9eLDLBHwvXZk8GjohHQ1QJAKNzrOU8u
KuiV5qpnU+TXofdnngX+ovveaCUJDh3Mg1tFeBJ7R+rB1nub8sGUgdnPmDaE3tpp
N3vUqLzUXzbo1Q==
-----END PRIVATE KEY----

openssl生成的公钥和私钥是Base64的,用时需要用base64解码

2、RSA加密和解密方法

   /*** 公钥加密* @param publicKey 公钥* @param obj 明文* @return byte[] 密文*/public static byte[] encrypt(RSAPublicKey publicKey, byte[] obj) throws Exception {Cipher cipher =Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE,publicKey);//返回加密后的内容return cipher.doFinal(obj);}/*** 私钥解密* @param privateKey 公钥* @param obj 密文* @return byte[] 密文*/public static byte[] decrypt(RSAPrivateKey privateKey, byte[] obj)throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);//返回解密后的数组return cipher.doFinal(obj);}

3、Base64编码和解码

maven

<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version>
</dependency>

代码:

    /*** 编码* @param txt byte字节数组* @return encode Base64编码*/public static byte[] encode(byte[] txt) {return org.apache.commons.codec.binary.Base64.encodeBase64(txt);}/*** 解码* @param txt 编码后的byte* @return decode Base64解码*/public static byte[] decode(String txt){return org.apache.commons.codec.binary.Base64.decodeBase64(txt);}

4、调用加解密

操作步骤

备注: openssl生成的公钥和私钥是Base64的,用时需要进行解码

1、先对公钥进行进行Base64解码。

2、再用解码后的公钥进行RSA加密(对密文进行Base64编码)

3、然后对私钥Base64解码

4、最后用解码的私钥进行RSA解密(输入:密文解码后入参,输出:转成字符串输出)。

 final static String PUBKEY="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDeOvgowlgzAiPdIdBsFK5Yk9dH\n" +"B3BXQa1IieIkRbxC7ZGYiXJELbzHi5vcmmFuadKQBA1BltR3yNdIptRM9/NRQtVo\n" +"e+kuFIU1X/MgFhIGlP4O56LL5L8RqOg8yj/EOJzYBU7ioMZX6f2uDjCJ0s7Nx45y\n" +"/cr9RQJZbv5WAx4YyQIDAQAB";final static String PRIKEY="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN46+CjCWDMCI90h\n" +"0GwUrliT10cHcFdBrUiJ4iRFvELtkZiJckQtvMeLm9yaYW5p0pAEDUGW1HfI10im\n" +"1Ez381FC1Wh76S4UhTVf8yAWEgaU/g7nosvkvxGo6DzKP8Q4nNgFTuKgxlfp/a4O\n" +"MInSzs3HjnL9yv1FAllu/lYDHhjJAgMBAAECgYAZqZWen1KwET8y+gSndnvrnqbt\n" +"fN5sNRldlw6WQbdLw0Nc6gJX/TAfmu+Uuf8mUPIPz2f4ewJuErNJoHpDqR5fvLeP\n" +"YQNdJNKFK3wSqc58pMBkABMJEod94RbTEgDtC8FRZUbz98IUVMTwByLrRqgoZqAW\n" +"3XYU9zaYdj5QzNvvQQJBAP14trvc3DwkNq3YwJ+iJfsYbTJ21nNyYaJkUx2sb43p\n" +"KPOdpx+dmmlkk+uRYdJK9eLp+0m4LsARYfGR1Vrm2UcCQQDgcnm2wSbPuwqrkPbO\n" +"njRhtbUtFgAUMIevOAAbZEa1CmBeQ5eOfDirlSa3W/ZtL3GkfZWNv+rBKuOSTWoW\n" +"vIVvAkEAyz4uGDkihz7qcT+qRNY56jtN4/cSQgPncdVMKDEKSho5cg5p4Zn4JKY3\n" +"Td6HN55Px6GikxwSsIO/q3oqP/d3JQJAP+mZKydZS/HxGeXPwgpe1CwQCWSoZRdk\n" +"q8qAjUxCri7kPjN1JsfMw19XhQMU6waFj9eLDLBHwvXZk8GjohHQ1QJAKNzrOU8u\n" +"KuiV5qpnU+TXofdnngX+ovveaCUJDh3Mg1tFeBJ7R+rB1nub8sGUgdnPmDaE3tpp\n" +"N3vUqLzUXzbo1Q==";public static void main(String[] args)throws Exception {byte[] decode = decode(PUBKEY);RSAPublicKey publicKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode));//执行加密和解密过程String InData="Hello World!";//得到要加密内容的数组byte[] byteInData =InData.getBytes("UTF-8");//用公钥加密byte[] cipherByte= encrypt(publicKey,byteInData);String cipher=new String(encode(cipherByte));System.out.println("RSA加密,密文:"+cipher);//用私钥解密byte[] decode_pri = decode(PRIKEY);RSAPrivateCrtKey priKey = (RSAPrivateCrtKey)KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decode_pri));byte[] plainByte =decrypt(priKey,decode(cipher));System.out.println("RSA私钥解密,明文:"+new String(plainByte));}

5、代码示例

package jmj;import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** Description :** @author : HMF* Date : Created in 22:04 2023/3/13* @version :*/
public class RSAUtil {final static String PUBKEY="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDeOvgowlgzAiPdIdBsFK5Yk9dH\n" +"B3BXQa1IieIkRbxC7ZGYiXJELbzHi5vcmmFuadKQBA1BltR3yNdIptRM9/NRQtVo\n" +"e+kuFIU1X/MgFhIGlP4O56LL5L8RqOg8yj/EOJzYBU7ioMZX6f2uDjCJ0s7Nx45y\n" +"/cr9RQJZbv5WAx4YyQIDAQAB";final static String PRIKEY="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN46+CjCWDMCI90h\n" +"0GwUrliT10cHcFdBrUiJ4iRFvELtkZiJckQtvMeLm9yaYW5p0pAEDUGW1HfI10im\n" +"1Ez381FC1Wh76S4UhTVf8yAWEgaU/g7nosvkvxGo6DzKP8Q4nNgFTuKgxlfp/a4O\n" +"MInSzs3HjnL9yv1FAllu/lYDHhjJAgMBAAECgYAZqZWen1KwET8y+gSndnvrnqbt\n" +"fN5sNRldlw6WQbdLw0Nc6gJX/TAfmu+Uuf8mUPIPz2f4ewJuErNJoHpDqR5fvLeP\n" +"YQNdJNKFK3wSqc58pMBkABMJEod94RbTEgDtC8FRZUbz98IUVMTwByLrRqgoZqAW\n" +"3XYU9zaYdj5QzNvvQQJBAP14trvc3DwkNq3YwJ+iJfsYbTJ21nNyYaJkUx2sb43p\n" +"KPOdpx+dmmlkk+uRYdJK9eLp+0m4LsARYfGR1Vrm2UcCQQDgcnm2wSbPuwqrkPbO\n" +"njRhtbUtFgAUMIevOAAbZEa1CmBeQ5eOfDirlSa3W/ZtL3GkfZWNv+rBKuOSTWoW\n" +"vIVvAkEAyz4uGDkihz7qcT+qRNY56jtN4/cSQgPncdVMKDEKSho5cg5p4Zn4JKY3\n" +"Td6HN55Px6GikxwSsIO/q3oqP/d3JQJAP+mZKydZS/HxGeXPwgpe1CwQCWSoZRdk\n" +"q8qAjUxCri7kPjN1JsfMw19XhQMU6waFj9eLDLBHwvXZk8GjohHQ1QJAKNzrOU8u\n" +"KuiV5qpnU+TXofdnngX+ovveaCUJDh3Mg1tFeBJ7R+rB1nub8sGUgdnPmDaE3tpp\n" +"N3vUqLzUXzbo1Q==";public static void main(String[] args)throws Exception {byte[] decode = decode(PUBKEY);RSAPublicKey publicKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode));//执行加密和解密过程String InData="Hello World!";//得到要加密内容的数组byte[] byteInData =InData.getBytes("UTF-8");//用公钥加密byte[] cipherByte= encrypt(publicKey,byteInData);String cipher=new String(encode(cipherByte));System.out.println("RSA加密,密文:"+cipher);//用私钥解密byte[] decode_pri = decode(PRIKEY);RSAPrivateCrtKey priKey = (RSAPrivateCrtKey)KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decode_pri));byte[] plainByte =decrypt(priKey,decode(cipher));System.out.println("RSA私钥解密,明文:"+new String(plainByte));}/*** 编码* @param txt byte字节数组* @return encode Base64编码*/public static byte[] encode(byte[] txt) {return org.apache.commons.codec.binary.Base64.encodeBase64(txt);}/*** 解码* @param txt 编码后的byte* @return decode Base64解码*/public static byte[] decode(String txt){return org.apache.commons.codec.binary.Base64.decodeBase64(txt);}/*** 公钥加密* @param publicKey 公钥* @param obj 明文* @return byte[] 密文*/public static byte[] encrypt(RSAPublicKey publicKey, byte[] obj) throws Exception {Cipher cipher =Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE,publicKey);//返回加密后的内容return cipher.doFinal(obj);}/*** 私钥解密* @param privateKey 公钥* @param obj 密文* @return byte[] 密文*/public static byte[] decrypt(RSAPrivateKey privateKey, byte[] obj)throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);//返回解密后的数组return cipher.doFinal(obj);}}

执行结果:

参考:

https://blog.csdn.net/caijiwyj/article/details/106840234

https://blog.csdn.net/qq78442761/article/details/119747726

Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对)相关推荐

  1. OpenSSL生成 SM2公私钥

    OpenSSL生成 SM2公私钥 当前形势 国密局字[2011]50号"关于做好公钥密码算法升级工作的通知", 要求新投入运行并使用公钥密码的信息系统,应使用SM2椭圆曲线密码算法 ...

  2. 对称加密、非对称加密、DES、AES、RSA、OpenSSL、数字签名、防篡改

    本公众号分享的所有技术仅用于学习交流,请勿用于其他非法活动,如果错漏,欢迎留言指正 <加密与解密>第4版 加解密 安全领域的重要分支和基础设施 互联网重要数据的传输需要加解密 TCP/IP ...

  3. java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

  4. RSA非对称加密和解密(同时生成密钥)

    RSA非对称加密和解密(同时生成密钥) 准备jar包 bcprov-jdk16-1.46.jar commons-codec-1.15.jar 获取jar地址:https://mvnrepositor ...

  5. 转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名...

    转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 July 20, 20 ...

  6. openssl生成RSA格式及pkcs1与pkcs8格式互相转换

    openssl简介 OpenSSL 是一个开源项目,其组成主要包括一下三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls ...

  7. 非对称加密实战(一):JDK生成keystore获取公钥私钥及代码验证【附源码】

    目录 使用说明 非对称加密 生成keystore文件 公钥私钥互相解密 获取fd-alias.keystore中的公钥私钥 使用生成公钥私钥进行解密 源码地址 使用说明 非对称加密 非对称加密算法主要 ...

  8. 妙借Git自带的OpenSSL生成RSA公私钥的.pem 文件

    大家好,我是神韵,是一个技术&生活博主.出文章目的主要是两个,一是好记忆不如烂笔头,记录总结中提高自己.二是希望我的文章可以帮到大家.欢迎来点赞打卡,你们的行动将是我无限的动力. 本篇主题是: ...

  9. 使用OpenSSL生成RSA证书

    一.生成RSA证书密钥对 下载OpenSSL windows版本 1)生成RSA私钥: genrsa -out private_key.pem 1024 该命令会生成1024位的私钥,生成成功的界面如 ...

最新文章

  1. 认识网页:html + css + JavaScript
  2. Android UI线程和非UI线程
  3. dfs hdfs 修改文件名称_CDH6.3.2生产更换HDFS 数据目录
  4. 爬虫-访问用户中心页面-服务端做了些什么
  5. 大数据-03-Spark入门
  6. JAVA简单选择排序算法原理及实现
  7. element vue 动态单选_SpringBoot+Vue(MyBatis + Shiro + Jwt + Druid + Redis + ElementUI )快速开发框架...
  8. window开机 关机 记录日志
  9. Atitit图片复制父目录给你设计的实现 基于win 图片浏览器
  10. 网络计算机装系统,网络克隆——为电脑重装系统
  11. 空间解析几何 | 空间曲线的切向量与曲面的法向量
  12. Snipaste截图软件的下载和使用(日常常用的一些功能)
  13. 《密码编码学与网络安全》William Stalling著---学习笔记(一)【知识点速过】【传统密码+经典对称加密算法+经典公钥密码算法+密码学Hash函数】
  14. 字节实习成功提前转正啦!
  15. 【loj2339】【WC2018】通道
  16. springboot中如何graceful关闭服务器
  17. BI(商业智能)的未来?
  18. 阿里云Linix上 python脚本 发邮件发送不出去问题
  19. java ee 系统视频_更好的网站登录系统,EE协作登录系统
  20. 安卓判断APP是在前台还是在后台

热门文章

  1. Flynn计算机体系结构分类方法
  2. for循环定义生成列表
  3. 如何修复“您需要注意的” Windows 10安装错误
  4. 从“奋力追赶”到“略有小成”,中国根技术要如何“破局”?
  5. macports安装问题总结
  6. English语法_物主代词
  7. 个人博客seo优化技巧
  8. Parasoft Jtest学习笔记
  9. Python学习笔记之schedule 定时任务
  10. 易语言字节集转php,易语言将下载地址解析转换成迅雷快车旋风的方法