sun*_*985 2 java rsa x509 public-key
我有以下格式的公钥
-----BEGIN PUBLIC KEY-----
xxxxxxxx
-----END PUBLIC KEY-----
我需要将其转换为以下格式
-----BEGIN RSA PUBLIC KEY-----
xxxxxxxxx
-----END RSA PUBLIC KEY-----
基本上,问题是我正在使用用Java编写的第三方库.
第三方库使用Java类"RSAPublicKeySpec"从String生成类型为RSAPublicKey的实例.
我提供给第三方库的字符串来自一个文件,格式如下:
-----BEGIN PUBLIC KEY-----
xxxxxxxx
-----END PUBLIC KEY-----
"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
Run Code Online (Sandbox Code Playgroud)
哎呀! 如果你在Java中使用BouncyCastle(或者在C中使用OpenSSL库,但你已经有了),那么现在我注意到了(更普遍的)在Java中生成PKCS#1格式的RSA密钥(以及从那里开始的几个链接)的(更一般)欺骗上面的OpenSSL命令行选项).
无论如何,如果您愿意,这里有两种使用纯Java编码的方法的概述:
0)它们都是通过将输入PEM转换为字节开始的.阅读"---- BEGIN"行,最好检查一下是否正确; 读取所有以下行(base64),但不包括"----- END"行; 将base64连接并解码为字节.Java8提供java.util.Base64
; 在此之前,你必须摆弄"内部"类或添加几个常见(但不是内置)库之一,如commons-codecs或自己编写(这并不难).现在选择步骤1或步骤2.
1)将这些字节解析为X.509 SubjectPublicKeyInfo的ASN.1 DER编码,如RFC 5280所示,包括AlgorithmIdentifier.确切地说:跳过外部序列的标签和长度; 跳过AlgorithmIdentifier的标签,长度和内容 - 或者更好地提取内容并检查它是否为rsaEncryption和NULL(或可能省略)参数的OID的SEQUENCE; 然后跳过BIT STRING的标记和长度以及第一个字节(未使用的位),并将(剩余的)内容作为编码密钥 - 这已经是您想要的PKCS#1 RSAPublicKey结构.继续第3步.
2)或者使用标准JCE来读取X.509格式密钥:将字节包装在一个中X509EncodedKeySpec
,将其赋予.generatePublic()
一个KeyFactory
用于RSA,并将结果转换为RSAPublicKey
.然后调用.getModulus()
和.getPublicExponent()
对得到的数学值,并且编码它们与所述结构的ASN.1 DER 在PKCS#1 RFC3447定义RSAPublicKey(用于PKIX/X.509在rfc3279 2.2.1).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"行,除非不需要.
归档时间: |
|
查看次数: |
5333 次 |
最近记录: |