問題描述
以以下格式發送字符串:
Have a String being sent from in the below format:
-----BEGIN RSA PUBLIC KEY-----
MIGHAoGBANAahj75ZIz9nXqW2H83nGcUao4wNyYZ9Z1kiNTUYQl7ob/RBmDzs5rY
mUahXAg0qyS7+a55eU/csShf5ATGzAXv+DDPcz8HrSTcHMEFpuyYooX6PrIZ07Ma
XtsJ2J4mhlySI5uOZVRDoaFY53MPQx5gud2quDz759IN/0gnDEEVAgED
-----END RSA PUBLIC KEY-----
如何從這個字符串構造一個 PublicKey 對象?已嘗試以下去掉頁眉頁腳和base64解碼緩沖區
How do i construct a PublicKey Object from this string ? Have tried the below Remove the header and footer and base64 decode the buffer
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);
}
這會失敗,要么是無效的密鑰格式,要么會出現以下錯誤
This fails either as an invalid key format or will get below error
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)
正在通過openSSL的API生成密鑰PEM_write_bio_RSAPublicKey(bio, rsa);
The Key is being generated thro the API of openSSL PEM_write_bio_RSAPublicKey(bio, rsa);
推薦答案
通過調用 PEM_write_bio_RSAPublicKey
,只有密鑰模數和公共指數被編碼到輸出 PEM 數據中.但是 X509EncodedKeySpec
應該是這種 ASN.1 密鑰格式:
by calling PEM_write_bio_RSAPublicKey
only the key modulus and public exponent are encoded into the output PEM data. However the X509EncodedKeySpec
is expected this ASN.1 key format:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
您應該使用 PEM_write_bio_PUBKEY
函數,該函數使用 SubjectPublicKeyInfo 結構對公鑰進行編碼,正如 X509EncodedKeySpec
You should use the PEM_write_bio_PUBKEY
function which encodes the public key using the SubjectPublicKeyInfo structure which as expected by X509EncodedKeySpec
解碼密鑰的另一種可能的解決方案.不幸的是,我認為不可能只使用標準 JDK API,但可以使用 Bouncycastle一個>圖書館
An other possible solution to decode the key. Unfortunately I don't think it is possible to do only with the standard JDK API but it can be done with the Bouncycastle library
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);
}
這篇關于我們如何將字符串從 PEM 轉換為 DER 格式的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!