原文地址: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. tf.keras.layers.Resizing 示例 改变维度的层
  2. 抽取、转换和装载介绍(八)实时的意义(待续)
  3. Visual Studio 2013或2015工程属性中包含目录和库目录的添加方法,附加依赖项,相对路径
  4. java 操作 ES 的方式 整理总结
  5. git 创建webpack项目_Webpack入门:从安装到配置
  6. 邹建老大写的经典SQL
  7. 【gRPC基础知识】快速部署
  8. 洛谷 P1508 Likecloud-吃、吃、吃
  9. Linux设置免密登录
  10. mxf格式怎么转换成mp4?
  11. 服务器损坏文件怎么办,“该文件可能已损坏或者文件所在的服务器没有响应或者该文件是只读的”怎么解决?...
  12. 【渝粤教育】广东开放大学 建筑工程计量与计价 形成性考核 (47)
  13. 一文教你如何快速高效画出技术架构图
  14. c语言结构体函数传递方式,c-将struct传递给函数
  15. 【Lua】ToLua逻辑热更新
  16. 一款不错的手机端视频剪辑软件
  17. 电脑显示网络2连接服务器失败,崩坏学园2连接服务器失败 连接不上网络怎么办...
  18. 服装企业的ERP实施是有条件的
  19. luogu4188 [USACO18JAN]Lifeguards S
  20. 苹果手机电池健康怎么看_MIUI12怎么看电池温度 小米手机电池损耗寿命查看方法...

热门文章

  1. c++自底向上算符优先分析_c语言运算符的优先级
  2. linux 从grub 进入rescue,在grub的rescue模式修复linux引导
  3. php pdo bind,PHPPDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别_php技巧
  4. 访问tomcat html,访问云服务器tomcat里html界面
  5. PHP做好友关系系统,php社交好友网站
  6. java 查询表 并返回数据_ajax与java前后台传值及数据表查询解决一个bug的问题
  7. ubuntu没有interfaces文件_ubuntu里终端中eth0为何没有显示IP地址
  8. 清华大学计算机毕业论文,清华大学毕业论文撰写要求
  9. 论文笔记 Spectral Regularization Algorithms for Learning Large IncompleteMatrices (soft-impute)
  10. 文巾解题 leetcode1442. 形成两个异或相等数组的三元组数目