您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

将X509公钥转换为RSA公钥

将X509公钥转换为RSA公钥

“ RSA PUBLIC KEY”格式在早期的SSLeay中使用,后来演变为OpenSSL,但我认为它在2000年之前就已过时,对于Java来说还很早,我认为 在Java拥有 任何 加密货币之前,甚至是受限制的加密货币都可以从Java 导出。美国。简而言之,“ RSA PUBLIC KEY”格式是PKCS#1的RSA特定格式,而“ PUBLIC KEY”是X.509通用结构,可处理多种(且可扩展)算法。因此,知道您的Java库的开发人员如何陷入这种奇怪的局限会很有趣。但不管怎么说 …

尽管这种格式已经过时了,但 它。如果您有可用的openssl命令行(可能在另一个文件/数据复制到该文件的系统上,请执行以下操作):

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

写完下面的内容后, 如果您在Java中使用BouncyCastle(或在C中使用OpenSSL库),则现在我注意到(更一般)的重复使用Java生成PKCS#1格式的RSA密钥(以及从那里开始的几个链接)。 (上面的OpenSSL命令行选项)。

无论如何,如果您愿意,这是使用 进行编码的两种方法的概述:

0)两者都 。阅读“ ---- BEGIN”行,最好检查一下它是否正确;读取(base64的)以下所有行,直到但不包括“ ----- END”行;将base64连接并解码为字节。Java8提供java.util.Base64; 在此之前,您必须摆弄“内部”类,或者添加诸如commons编解码器之类的几种常见(但不是内置)库之一,或者自己编写(这并不难)。现在选择步骤1或步骤2。

1) 这些字节,作为X.509 SubjectPublicKeyInfoASN.1 DER编码,如RFC 5280中所示,包括AlgorithmIdentifier。确切地说,跳过外部序列的标签和长度;跳过AlgorithmIdentifier的标签,长度和内容- 或者更好地提取内容,并检查它是否为rSAEncryption和NULL(或可能省略)参数的OID的SEQUENCE;然后跳过 的标签,长度和第一个字节(未使用的位),并将(剩余的) 作为编码的密钥-这已经是您想要的PKCS#1 RSAPublicKey结构。继续执行步骤3。

2) 使用标准JCE 密钥:将字节包装在中X509EncodedKeySpec,将其.generatePublic()提供KeyFactory给RSA 以供使用,然后将结果转换为RSAPublicKey。然后调用.getModulus().getPublicExponent()对 与所述结构的ASN.1 DER 在PKCS#定义RSAPublicKey 1 RFC3447(在rfc3279 2.2.1用于PKIX / X.509)。BigInteger.toByteArray()精确给出ASN.1想要的大尾数带符号的二进制补码形式,因此包括获取两个.toByteArray()值,为每个值添加tag = INTEGER(0x02)和长度前缀,然后添加tag = SEQUENCE-composite(0x30 )和连接长度的前缀。然后继续执行步骤3。

3)现在,您具有了构成PKCS#1 RSAPublicKey的字节, :编码为base64; 如有必要,请分成几行(以64个字符为单位),或者为了确保安全起见;并添加“ BEGIN”和“ END”行,除非不需要。

其他 2022/1/1 18:16:23 有626人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶