MSS*_*SSV 10 java cryptography jce
从以下格式发送字符串:
-----BEGIN RSA PUBLIC KEY-----
MIGHAoGBANAahj75ZIz9nXqW2H83nGcUao4wNyYZ9Z1kiNTUYQl7ob/RBmDzs5rY
mUahXAg0qyS7+a55eU/csShf5ATGzAXv+DDPcz8HrSTcHMEFpuyYooX6PrIZ07Ma
XtsJ2J4mhlySI5uOZVRDoaFY53MPQx5gud2quDz759IN/0gnDEEVAgED
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
如何从此字符串构造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);
}
Run Code Online (Sandbox Code Playgroud)
这可能会作为无效的密钥格式失败,也会失败
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)
Run Code Online (Sandbox Code Playgroud)
密钥是通过openSSL的API生成的 PEM_write_bio_RSAPublicKey(bio, rsa);
通过PEM_write_bio_RSAPublicKey仅调用密钥模数和公共指数被编码到输出PEM数据中.但是,这X509EncodedKeySpec是ASN.1密钥格式的预期:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
Run Code Online (Sandbox Code Playgroud)
您应该使用PEM_write_bio_PUBKEYSubjectPublicKeyInfo结构对公钥进行编码的函数,该结构符合预期X509EncodedKeySpec
解码密钥的另一种可能的解决方案.不幸的是,我不认为只能使用标准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);
}
Run Code Online (Sandbox Code Playgroud)
BouncyCastle的PEMReader将为您完成此任务:
String pemKey = "-----BEGIN RSA PUBLIC KEY-----\n"
+ "MIGHAoGBANAahj75ZIz9nXqW2H83nGcUao4wNyYZ9Z1kiNTUYQl7ob/RBmDzs5rY\n"
+ "mUahXAg0qyS7+a55eU/csShf5ATGzAXv+DDPcz8HrSTcHMEFpuyYooX6PrIZ07Ma\n"
+ "XtsJ2J4mhlySI5uOZVRDoaFY53MPQx5gud2quDz759IN/0gnDEEVAgED\n"
+ "-----END RSA PUBLIC KEY-----\n";
PEMReader pemReader = new PEMReader(new StringReader(pemKey));
RSAPublicKey rsaPubKey = (RSAPublicKey) pemReader.readObject();
System.out.println("Public key: "+rsaPubKey);
Run Code Online (Sandbox Code Playgroud)
(请注意,您Security.addProvider(new BouncyCastleProvider());之前可能需要某处.)