gpt4 book ai didi

java - 我们如何将字符串从 PEM 格式转换为 DER 格式

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:53:53 26 4
gpt4 key购买 nike

以以下格式发送字符串:

-----BEGIN RSA PUBLIC KEY-----
MIGHAoGBANAahj75ZIz9nXqW2H83nGcUao4wNyYZ9Z1kiNTUYQl7ob/RBmDzs5rY
mUahXAg0qyS7+a55eU/csShf5ATGzAXv+DDPcz8HrSTcHMEFpuyYooX6PrIZ07Ma
XtsJ2J4mhlySI5uOZVRDoaFY53MPQx5gud2quDz759IN/0gnDEEVAgED
-----END RSA PUBLIC KEY-----

我如何从这个字符串构造一个 PublicKey 对象?尝试过以下去掉页眉和页脚并base64解码缓冲区

public static PublicKey getFromString(String keystr) throws Exception
{
//String S1= asciiToHex(keystr);
byte[] keyBytes = new sun.misc.BASE64Decoder().decodeBuffer(keystr);
X509EncodedKeySpec spec =
new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);

}

这会因为无效的 key 格式而失败,或者会出现以下错误

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:188)
at java.security.KeyFactory.generatePublic(KeyFactory.java:304)
at PublicKeyReader.getFromString(PublicKeyReader.java:30)
at Tst.main(Tst.java:36)

key 是通过 openSSL 的 API PEM_write_bio_RSAPublicKey(bio, rsa);

最佳答案

通过调用 PEM_write_bio_RSAPublicKey,只有 key 模数和公共(public)指数被编码到输出 PEM 数据中。然而 X509EncodedKeySpec预计此 ASN.1 key 格式:

 SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }

您应该使用 PEM_write_bio_PUBKEY 函数,该函数使用 X509EncodedKeySpec 预期的 SubjectPublicKeyInfo 结构对公钥进行编码

解码 key 的另一种可能解决方案。不幸的是,我认为仅使用标准 JDK API 是不可能的,但可以使用 Bouncycastle 来完成。图书馆

import org.bouncycastle.asn1.*;
import org.bouncycastle.asn1.x509.RSAPublicKeyStructure;

public static PublicKey getFromString(String keystr) throws Exception
{
//String S1= asciiToHex(keystr);
byte[] keyBytes = new sun.misc.BASE64Decoder().decodeBuffer(keystr);
ASN1InputStream in = new ASN1InputStream(keyBytes);
DERObject obj = in.readObject();
RSAPublicKeyStructure pStruct = RSAPublicKeyStructure.getInstance(obj);
RSAPublicKeySpec spec = new RSAPublicKeySpec(pStrcut.getModulus(), pStruct.getPublicExponent());
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}

关于java - 我们如何将字符串从 PEM 格式转换为 DER 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4032985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com