[英]Exception in generating the private key from RSA key in marshmallow device in android
我正在使用此代码从RSA密钥生成私钥
public class ReadPKCS8Pem {
private final static String PRIVATE_KEY = Keys.PRIVATE_KEY;
public static PrivateKey getKey(){
try{
// Read in the key into a String
StringBuilder pkcs8Lines = new StringBuilder();
BufferedReader rdr = new BufferedReader(new StringReader(PRIVATE_KEY));
String line;
while ((line = rdr.readLine()) != null) {
pkcs8Lines.append(line);
}
// Remove the "BEGIN" and "END" lines, as well as any whitespace
String pkcs8Pem = pkcs8Lines.toString();
pkcs8Pem = pkcs8Pem.replace("-----BEGIN RSA PRIVATE KEY-----", "");
pkcs8Pem = pkcs8Pem.replace("-----END RSA PRIVATE KEY-----", "");
pkcs8Pem = pkcs8Pem.replaceAll("\\s+","");
// Base64 decode the result
byte [] pkcs8EncodedBytes = Base64.decode(pkcs8Pem, Base64.DEFAULT);
// extract the private key
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(keySpec);
System.out.println(privKey);
return privKey;
}catch (Exception ex){
ex.printStackTrace();
}
return null;
}
}
在线:
PrivateKey privKey = kf.generatePrivate(keySpec);
我得到了例外:
java.lang.RuntimeException: error:0c0890ba:ASN.1 encoding routines:asn1_check_tlen:WRONG_TAG
marshmallow device
遇到此异常,但在我的Oreo device
,它工作正常,我能够成功生成私钥 PEM文件中的标题-----BEGIN RSA PRIVATE KEY-----
表示它包含PKCS#1密钥,但Java(和Android)不支持pkcs1,因此您需要将密钥从pkcs1转换为pcks8使用像openssl这样的工具
# openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs1.key -out pkcs8.key
或者,您可以使用Bouncycastle加载密钥。 请参阅JAVA中的读取格式PKCS1的RSA私钥
我不知道为什么它在Oreo中有效,可能是underliying提供商将支持转换,即使它没有记录https://developer.android.com/reference/java/security/spec/PKCS8EncodedKeySpec
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.