Java 将X509公钥转换为RSA公钥
我有一个公钥,格式如下Java 将X509公钥转换为RSA公钥,java,rsa,x509,public-key,Java,Rsa,X509,Public Key,我有一个公钥,格式如下 -----开始公钥----- xxxxxxxx -----结束公钥----- 我需要将其转换为以下格式 -----开始RSA公钥----- xxxxxxxxx -----结束RSA公钥----- 基本上,问题是我正在使用一个用Java编写的第三方库 第三方库使用Java类“RSAPublicKeySpec”从字符串生成RSAPublicKey类型的实例 我提供给此第三方库的字符串取自以下格式的文件: -----开始公钥----- xxxxxxxx -----结束
-----开始公钥-----
xxxxxxxx
-----结束公钥-----
我需要将其转换为以下格式
-----开始RSA公钥-----
xxxxxxxxx
-----结束RSA公钥-----
基本上,问题是我正在使用一个用Java编写的第三方库
-----开始公钥-----
xxxxxxxx
-----结束公钥-----
java.util.Base64
;在此之前,您必须处理“内部”类,或者添加几个常见(但不是内置)库中的一个,比如commons codecs,或者自己编写(这并不难)。现在选择步骤1或步骤2
1) 将这些字节解析为包含。确切地说:跳过标签和外部序列的长度;跳过AlgorithmIdentifier的标记、长度和内容——或者更好地提取内容并检查它是一个OID序列,用于RSA加密和NULL(或可能省略)参数;然后跳过位字符串的标记、长度和第一个字节(未使用的位),并将(剩余的)内容作为编码密钥——这已经是您想要的PKCS#1 RSACPublicKey结构。继续执行步骤3
2) 或使用标准JCE来读取X.509格式的密钥:将字节包装在X509EncodedKeySpec
中,将其交给RSA的密钥工厂的generatePublic()
,并将结果强制转换为RSPublicKey
。然后调用.getmodule()
和.getPublicExponent()
以获取数学值,并用结构(用于rfc3279 2.2.1中的PKIX/X.509)在ASN.1中对其进行编码BigInteger.toByteArray()
提供了ASN.1所需的大端有符号二补形式,因此它包括:
获取.toByteArray()
两个值,为每个值添加tag=INTEGER(0x02)和length前缀,然后为它们的串联添加tag=SEQUENCE composite(0x30)和length前缀。然后继续执行步骤3
3) 现在您有了构成PKCS#1 RSAPublicKey的字节,转换为PEM:编码为base64;如果需要,或者为了安全起见,可以分成几行(64个字符);并添加“开始”和“结束”行,除非不需要
openssl rsa -in publickey.pem -out rsapublickey.pem -pubin -RSAPublicKey_out