原文地址:https://stackoverflow.com/questions/7611383/generating-rsa-keys-in-pkcs1-format-in-java

When I generate an RSA key pair using the Java API, the public key is encoded in the X.509 format and the private key is encoded in the PKCS#8 format. I'm looking to encode both as PKCS#1. Is this possible? I've spent a considerable amount of time going through the Java docs but haven't found a solution. The result is the same when I use the Java and the Bouncy Castle providers.

Here is a snippet of the code:

KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA","BC"); keygen.initialize(1024); KeyPair pair = keygen.generateKeyPair(); PrivateKey priv = pair.getPrivate(); PublicKey pub = pair.getPublic(); byte[] privBytes = priv.getEncoded(); byte[] pubBytes = pub.getEncoded();

The two resulting byte arrays are formatted as X.509 (public) and PKCS#8 (private).

Any help would be much appreciated. There are some similar posts but none really answer my question.

Thank You

You will need BouncyCastle:

import org.bouncycastle.asn1.ASN1Encodable; import org.bouncycastle.asn1.ASN1Primitive; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.util.io.pem.PemObject; import org.bouncycastle.util.io.pem.PemWriter;

The code snippets below have been checked and found working with Bouncy Castle 1.52.

Private key

Convert private key from PKCS8 to PKCS1:

PrivateKey priv = pair.getPrivate(); byte[] privBytes = priv.getEncoded(); PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(privBytes); ASN1Encodable encodable = pkInfo.parsePrivateKey(); ASN1Primitive primitive = encodable.toASN1Primitive(); byte[] privateKeyPKCS1 = primitive.getEncoded();

Convert private key in PKCS1 to PEM:

PemObject pemObject = new PemObject("RSA PRIVATE KEY", privateKeyPKCS1); StringWriter stringWriter = new StringWriter(); PemWriter pemWriter = new PemWriter(stringWriter); pemWriter.writeObject(pemObject); pemWriter.close(); String pemString = stringWriter.toString();

Check with command line OpenSSL that the key format is as expected:

openssl rsa -in rsa_private_key.pem -noout -text

Public key

Convert public key from X.509 SubjectPublicKeyInfo to PKCS1:

PublicKey pub = pair.getPublic(); byte[] pubBytes = pub.getEncoded(); SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(pubBytes); ASN1Primitive primitive = spkInfo.parsePublicKey(); byte[] publicKeyPKCS1 = primitive.getEncoded();

Convert public key in PKCS1 to PEM:

PemObject pemObject = new PemObject("RSA PUBLIC KEY", publicKeyPKCS1); StringWriter stringWriter = new StringWriter(); PemWriter pemWriter = new PemWriter(stringWriter); pemWriter.writeObject(pemObject); pemWriter.close(); String pemString = stringWriter.toString();

Check with command line OpenSSL that the key format is as expected:

openssl rsa -in rsa_public_key.pem -RSAPublicKey_in -noout -text

Thanks

Many thanks to the authors of the following posts:

  • https://stackoverflow.com/a/8713518/1016580
  • https://stackoverflow.com/a/14052651/1016580
  • https://stackoverflow.com/a/14068057/1016580

Those posts contained useful, though sometimes outdated info (i.e. for older versions of BouncyCastle), that helped me to construct this post.

转载于:https://www.cnblogs.com/davidwang456/p/8807768.html

Generating RSA keys in PKCS#1 format in Java--转相关推荐

  1. RSA公钥格式PKCS#1,PKCS#8互转(微信获取RSA加密公钥)

    /把RSA公钥格式PKCS#1转换成PKCS#8org.bouncycastle.asn1.pkcs.RSAPublicKey rsaPublicKey = org.bouncycastle.asn1 ...

  2. PHP rsa私钥pkcs8加密,Openssl rsa私钥的PKCS#1和PKCS#8格式以及加密和转化

    这里主要介绍: 私钥的PKCS#1格式,及PKCS#8格式 格式PKCS#1和PKCS#8之间的互相转化 私钥的加密,解密 PKCS#1 -> PKCS#8 生成PKCS#1私钥 $ opens ...

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

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

  4. PKCS#1 v2.1 RSA Cryptography Standard (PKCS#1 RSA密码学规范,版本2.1)

    PKCS#1 v2.1: RSA密码学规范 RSA实验室 2002年6月14日 --翻译:CaesarZou (zoudeqiang1979@tsinghua.org.cn) 1.介绍 这个文档提供了 ...

  5. java实现rsa欧几里得算法求d_RSA 加密算法的 java 实现

    一.RSA 介绍 以下引自百度百科 RSA 是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当 ...

  6. RSA非对称加密(以Android和java为例)

    一.概念 1.1目的 由于工作中用到了趟过了许多的坑所以深有体会,所以想写个笔记怕以后忘记了,好到时候回来看看. 首先是一定要知道最基础的概念,一定要知道最基础的概念,一定要知道最基础的概念,以免被误 ...

  7. [Java][Android][Rsa]rsa加密算法实现,android加密,java解密,相关问题及解决方案

    RSA算法属于非对称加密算法,通常是生成一对密钥,其中之一是保密密钥,由用户保存:另一个为公开密钥,可对外公开,甚至可在网络服务器中注册.安全性来说,迄今为止都没被真正破解过. 文末附完整RSA加密代 ...

  8. Cisco Equipment Configuration SSH login

    Cisco's products currently only support SSH-1, does not support SSH-2, IOS support SSH features Vers ...

  9. Cisco路由器的安全配置简易方案

    Cisco路由器的安全配置简易方案 Author: BluShin Auditor: Amy E-mail:Yangtonguang@163.com Version 1.0 Date: 2002-12 ...

最新文章

  1. 使用VMware新建Ubuntu虚拟机
  2. opengl加载显示3D模型X3D类型文件
  3. php的工作流程是什么,工作流程 · PHP-ML中文文档 · 看云
  4. EF Core:一统SQL和NoSQL数据库
  5. python历史背景_python学习之旅1-1(python背景、安装介绍)
  6. Java类型推断将不再支持可变性规范
  7. Delphi 程序开发范例宝典(第2版)高清PDF下载 附光盘
  8. Vue.js学习系列(八)---使用路由搭建单页应用(一)
  9. 工作中常用Linux命令总结一
  10. 海康SDK设备信息NET_DVR_GET_DEVICECFG解析
  11. 【计算机网络】笔记2——三种交换方式:电路交换,分组交换,报文交换
  12. 《那些年啊,那些事——一个程序员的奋斗史》——77
  13. 不做自了汉,大家好才是真的好
  14. 【无标题】A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Pl
  15. java我们一起打雪仗_我们一起打雪仗四年级作文
  16. 十九、 指派问题 - 匈牙利法 (0-1 整数规划)
  17. opencv各lib库的功能
  18. Matlab中读取excel表格数据
  19. 客户要求降价,我如何通过涨价拿下订单
  20. Windows下配置Git连接上github, 并将本地文件夹同步(加入了个人注释)

热门文章

  1. html5点击显示展开列表,HTML5 - 如何折叠和展开复杂的表格元素
  2. php %3c php 攻击,web 攻击靶机解题过程
  3. 软件商店下载java_Sun升级Java应用商店
  4. python爬虫,记录一下爬取过程,列表数据,翻页,post方式,保存字典
  5. 不同的PCB混装方式及加工工艺
  6. java怎么让表格的字段相乘,excel表格怎么让数据相乘-如何在excel表格中设置乘法公式...
  7. JAVA 之反射(基础概念) 几个主要常用的重要的方法
  8. keras inceptionv1 到 inceptionv4演化
  9. 文巾解题 178. 分数排名
  10. 产品经理经验谈:从产品经理、用户、产品的角度重新认知产品运营