JAVA的公钥格式_java – 将X509公钥转换为RSA公钥

我有以下格式的公钥

—–开始公钥—–

XXXXXXXX

—– END PUBLIC KEY —–

我需要将其转换为以下格式

—–开始RSA公钥—–

XXXXXXXXX

—– END RSA PUBLIC KEY —–

基本上,问题是我正在使用用Java编写的第三方库.

>第三方库使用Java类“RSAPublicKeySpec”从String生成RSAPublicKey类型的实例.

>我提供给第三方库的字符串取自以下格式的文件:

—–开始公钥—–

XXXXXXXX

—– END PUBLIC KEY —–

>稍微调试一下代码之后,我可以看到,如果我使用java类“X509EncodedKeySpec”来加载这个公钥,我的代码的签名验证部分就能完美运行.但是,由于代码是第三方库,我没有在代码中更改类类型的选项.我需要以某种方式确保我提供给库的输入与“RSAPublicKeySpec”类兼容,以便正确加载公钥.

解决方法:

“RSA PUBLIC KEY”格式在早期的SSLeay中使用,后来演变为OpenSSL,但在2000年之前已经过时了,我相信,这是Java的早期阶段,我认为在Java有任何加密之前,即使是受限制的类型,也允许从美国.简而言之,“RSA PUBLIC KEY”格式是来自PKCS#1的RSA特定格式,而“PUBLIC KEY”是处理大量(和可扩展)算法的X.509通用结构.因此,了解Java库的开发人员如何将自己置于这种奇怪的限制中会很有趣.但无论如何 …

虽然这种格式已经过时,但OpenSSL仍然支持它.如果你有openssl命令行可用(可以在你将文件/数据复制到另一个系统的另一个系统上),只需执行以下操作:

openssl rsa -in publickey.pem -out rsapublickey.pem -pubin -RSAPublicKey_out

哎呀!写了下面的内容,现在我注意到(更普遍的)在Generating RSA keys in PKCS#1 format in Java的欺骗

(如果你在Java中使用BouncyCastle(或者在C中使用OpenSSL库,但你已经在上面使用了OpenSSL命令行选项),那么(以及那里的几个链接)).

无论如何,如果您愿意,这里有两种使用纯Java编码的方法的概述:

0)它们都是通过将输入PEM转换为字节开始的.阅读“—- BEGIN”行,最好检查一下是否正确;读取所有以下行(base64),但不包括“—– END”行;将base64连接并解码为字节. Java8提供了java.util.Base64;在此之前,你必须摆弄“内部”类或添加几个常见(但不是内置)库之一,如commons-codecs或自己编写(这并不难).现在选择步骤1或步骤2.

1)将这些字节解析为X.509 SubjectPublicKeyInfo as shown in RFC 5280的ASN.1 DER编码,包括AlgorithmIdentifier.准确地说:跳过外部序列的标记和长度;跳过AlgorithmIdentifier的标签,长度和内容 – 或者更好地提取内容并检查它是否为rsaEncryption和NULL(或可能省略)参数的OID的SEQUENCE;然后跳过BIT STRING的标记和长度以及第一个字节(未使用的位),并将(剩余的)内容作为编码密钥 – 这已经是您想要的PKCS#1 RSAPublicKey结构.继续第3步.

2)或使用标准JCE读取X.509格式密钥:将字节包装在X509EncodedKeySpec中,将其提供给RSA的KeyFactory的.generatePublic(),并将结果转换为RSAPublicKey.然后调用.getModulus()和.getPublicExponent()来获取数学值,并使用结构RSAPublicKey defined in PKCS#1 rfc3447(用于rfc3279 2.2.1中的PKIX / X.509)在ASN.1 DER中对它们进行编码. BigInteger.toByteArray()完全给出了ASN.1想要的big-endian签名的二进制补码形式,因此它包括:

获取.toByteArray()值,为每个值添加tag = INTEGER(0x02)和长度前缀,然后在其串联中添加tag = SEQUENCE-composite(0x30)和长度前缀.然后继续执行步骤3.

3)现在你有了构成PKCS#1 RSAPublicKey的字节,转换为PEM:encode to base64;如果需要,可以分成几行(64个字符),或者总是安全;并添加“BEGIN”和“END”行,除非不需要.

标签:java,rsa,x509,public-key

来源: https://codeday.me/bug/20191007/1865210.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值