RSA取名来自Ron Rivest、Adi Shamirh和LenAdleman三个发明者的名字。

RSA原理:RSA算法基于一个十分简单的数论事实,将两个大素数相乘十分容易,但反过来想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

RSA缺点:RSA的keysize位数越高,其产生密钥对及加密、解密的速度越慢,这是基于大素数非对称加密算法的缺陷。

使用OpenSSL来生成私钥和公钥

查看版本信息:

ershixiongdeMacBook-Pro:~ zzs$ openssl version -a

OpenSSL 0.9.8zh 14 Jan 2016

built on: Nov 19 2017

platform: darwin64-x86_64-llvm

options: bn(64,64) md2(int) rc4(ptr,char) des(idx,cisc,16,int) blowfish(idx)

compiler: -arch x86_64 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O3 -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DMD32_REG_T=int -DOPENSSL_NO_IDEA -DOPENSSL_PIC -DOPENSSL_THREADS -DZLIB -mmacosx-version-min=10.6

OPENSSLDIR: "/System/Library/OpenSSL"

生成私钥:

ershixiongdeMacBook-Pro:~ zzs$ openssl genrsa -out rsa_private_key.pem 1024

Generating RSA private key, 1024 bit long modulus

..++++++

................++++++

e is 65537 (0x10001)

这条命令让openssl随机生成了一份私钥,加密长度是1024位。加密长度是指理论上最大允许“被加密的信息”长度的限制,也就是明文的长度限制。随着这个参数的增大(比方说2048),允许的明文长度也会增加,但同时也会造成计算复杂度的极速增长。一般推荐的长度就是1024位(128字节)。

ershixiongdeMacBook-Pro:~ zzs$ cat rsa_private_key.pem

-----BEGIN RSA PRIVATE KEY-----

MIICXwIBAAKBgQDQtmuOBLnIcRxy+R7cLMrttBGcNlfTouw4t/dZId5xYd/F76E3

wk3dk0QIYEUVY1bZY8sq7Xv8AzzcnsRi5DM3jxHRl8vGu50TjKLhEG5y+z//LrOe

XyLaKRMPBp1bP9vk4gJrXJGrQpX4aNZEsTor/07tG+onRQXup/RLHS0lkQIDAQAB

AoGBAILcTbV+6wltOjwwTJQaFaZSh9QdEpYkid3KIvEk1jba+hY9+CRg1Ld/tWFX

Exmk7nhhJKqmul05nnhpp5KlqCIjxY5jt1CbX2CxEGN0fJKyzVxKV8Tik9iI246x

vVh6VhbBDhommpjS0TxZNgNowMzXqIhii4sgwmvn0TZ9CCCrCQ2687ey2CyUCGGF

mEpUtrAnMwJBANQFdjrXwxbRmlLU+T3I1P/U2r4B/eW6OdKSGpTQEsbH3uL0rmxn

6funBtaxCzaawkGfUw4FOXEiwBkhcdZWJKj/hvqLTXocw2PLiEKOxqjWjebjAkEA

kqVIdkCf9ht5gws9bQeIk36U4VEdXJSmw8c8TWtxYT4DIrUcI2y2eKDEJ9RYNrop

Wrdh9+yvt7Rr7RswTUQ8ywJBANJ+RdtARPS+nHhddw47lLo000UT38AkCcoa4q9k

F0+mizZUwhJzdOk4qCOM0jSVF0uV/ois4FkE+cfXTdaonyg=

-----END RSA PRIVATE KEY-----

内容都是标准的ASCII字符,开头一行和结尾一行有明显的标记,真正的私钥数据是中间的不规则字符。

密钥文件最终将数据通过Base64编码进行存储。可以看到上述密钥文件内容每一行的长度都很规律。这是由于RFC2045中规定:The encoded output stream must be represented in lines of no more than 76 characters each。也就是说Base64编码的数据每行最多不超过76字符,对于超长数据需要按行分割。

根据私钥生成公钥:

ershixiongdeMacBook-Pro:~ zzs$ openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout

writing RSA key

查看公钥内容:

ershixiongdeMacBook-Pro:~ zzs$ cat rsa_public_key.pem

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQtmuOBLnIcRtBGc

NlfTouw4t/dZId5xYd/F76E3wk3dk0QIYEUVY1bZY8sq7Xv8AzzcjxHR

l8vGu50TjKLhEG5y+rOeXyLaKRMPBp1bP9vk4gJrXJGrQpX4aNZEsTor/07t

G+onRQXup/RLHS0lkQIDAQAB

-----END PUBLIC KEY-----

这时候的私钥还不能直接被使用,需要进行PKCS#8编码:

ershixiongdeMacBook-Pro:~ zzs$ openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt

命令中指明了输入私钥文件为rsa_private_key.pem,输出私钥文件为pkcs8_rsa_private_key.pem,不采用任何二次加密(-nocrypt)

再来看一下,编码后的私钥文件是不是和之前的私钥文件不同了:

ershixiongdeMacBook-Pro:~ zzs$ cat pkcs8_rsa_private_key.pem

-----BEGIN PRIVATE KEY-----

MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBANC2a44EuchxHHL5

Htwsyu20EZw2V9Oi7Di391kh3nFh38XvoTfCTd2TRAhgRRVjVtljyyrte/wDPNye

xGLkMzePEdGXy8a7nROMouEQbnL7P/8us55fItopEw8GnVs/2+TiAmtckatClfho

1B0SliSJ3coi8STWNtr6Fj34JGDUt3+1YVcTGaTueGEkqqa6XTmeeGmnkqWoIiPF

G4Wl9VIhfxnh/DA0BJ0CQQD8AUKXMzKYdAC9WHpWFsEOGiaamNLRPFk2A2jAzNeo

iGKLiyDCa+fRNn0IIKsJDbrzt7LYLJQIYYWYSlS2sCczAkEA1AV2OtfDFtGaUtT5

fM8wKwJBAMKC0nxURzRHLZ74oQy76W1SIAPp+6cG1rELNprCQZ9TDgU5cSLAGSFx

1lYkqP+G+otNehzDY8uIQo7GqNaN5uMCQQCSpUh2QJ/2G3mDCz1tB4iTfpThUR1c

20BE9L6ceF13DjuUujTTRRPfwCQJyhrir2QXT6aLNlTCEnN06TioI4zSNJUXS5X+

iKzgWQT5x9dN1qifKA==

-----END PRIVATE KEY-----

至此,可用的密钥对已经生成好了,私钥使用pkcs8_rsa_private_key.pem,公钥采用rsa_public_key.pem。

第一步生成的私钥文件编码是PKCS#1格式,这种格式Java其实是支持的,只不过多写两行代码而已:

RSAPrivateKeyStructure asn1PrivKey = new RSAPrivateKeyStructure((ASN1Sequence) ASN1Sequence.fromByteArray(priKeyData));

RSAPrivateKeySpec rsaPrivKeySpec = new RSAPrivateKeySpec(asn1PrivKey.getModulus(), asn1PrivKey.getPrivateExponent());

KeyFactory keyFactory= KeyFactory.getInstance("RSA");

PrivateKey priKey= keyFactory.generatePrivate(rsaPrivKeySpec);

首先将PKCS#1的私钥文件读取出来(注意去掉减号开头的注释内容),然后使用Base64解码读出的字符串,便得到priKeyData,也就是第一行代码中的参数。最后一行得到了私钥。接下来的用法就没什么区别了。

参考文献:https://community.oracle.com/thread/1529240?start=0&tstart=0

加载公钥与加载私钥的不同点在于公钥加载时使用的是X509EncodedKeySpec(X509编码的Key指令),私钥加载时使用的是PKCS8EncodedKeySpec(PKCS#8编码的Key指令)。

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

java openssl rsa_Java中使用OpenSSL生成的RSA公私钥进行数据加解密相关推荐

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

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

  2. Java中使用OpenSSL生成的RSA公私钥进行数据加解密

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7275632,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  3. Java中不依赖于第三方库使用OpenSSL生成的RSA公私钥进行数据加解密

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7275632,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  4. Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍

    最近用到企业微信向银行卡转账功能,因为需要使用到:标准RSA算法 故在网上了解一下相关的信息 SA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdlem ...

  5. Java基于OpenSSL生成 RSA 公私钥对数据进行加解密

    使用OpenSSL来生成私钥和公钥 验证机器上是否安装openssl 命令:openssl version -a [root@node00 test]# openssl version -a Open ...

  6. php rsa 证书生成工具,RSA公私钥快速生成和RSA证书快速创建利器

    一.创建pkcs8格式的RSA私钥和和公钥 步骤如下: 1.生成 RSA 私钥 openssl genRSA -out RSAprivatekey.pem 1024 2.生成对应的公钥 openssl ...

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

    Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对) 1.openssl生成RSA公私钥对 [root@loaclhost ~]# openssl version OpenS ...

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

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

  9. RSA公私钥格式分析及其在Java和Openssl之间的转换方法

    文章目录 PKCS#1和PKCS#8 X.509公钥证书 ASN.1抽象语法标记 DER和PEM编码 OID对象标识符 用openssl命令生成PKCS1#格式的RSA密钥对 生成私钥 从私钥中导出公 ...

  10. 使用Java代码生成RSA公私钥的.pem文件

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

最新文章

  1. 14 | 深入解析Pod对象(一):基本概念
  2. [Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句
  3. python随机数种子通俗_在种子中生成随机数
  4. configurablebeanfactory
  5. 移植memtester到android平台
  6. 面试官常问的线程池,你真的了解吗?
  7. 阿里巴巴android图标素材网,阿里巴巴矢量图标库
  8. 无法启动此程序,因为计算机中丢失 的解决办法
  9. Unity碰撞和触发
  10. Skyscrapers (hard version)(1900/单调栈)
  11. memery leak Exception
  12. 使用Andriod Device Moniter时用正则表达式筛选指定日志
  13. 微信小程序页面跳转时数据传输
  14. 小型双轮差速底盘实现触须避障
  15. Python编辑基础课后习题(持续更新)
  16. 更换网站logo,超简单方法
  17. python工控开发框架_GitHub - hzglitter/isf: ISF(Industrial Security Framework),基于Python的工控漏洞利用框架...
  18. Grafana面板(panel):从数据源请求数据
  19. OpenCV-二值图像连通域分析
  20. vue3时间戳格式转换

热门文章

  1. JOB DESCRIPTION
  2. 面试常见问题及应答技巧
  3. 面向对象之魔术方法_call
  4. 黑马程序员最新Python教程——第一阶段(1)
  5. 菏泽学院计算机学院康鸿雁,菏泽学院在山东省大学生软件设计大赛中获佳绩
  6. linux进入cbq文件夹,Linux流量控制(SFQ/TBFPRIO/CBQ/HTB原理介绍)
  7. 分布式部署OpenDevOps报502错问题解决全过程
  8. 【3本精挑细选的书籍】网络爬虫推荐书籍(Python)【从0到实践】
  9. Scratch软件编程等级考试一级——20220918
  10. 数学公式编辑器mathtype安装包免费版下载