java - 在android的棉花糖设备中从RSA密钥生成私钥的异常
问题描述
我正在使用此代码从 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,因此您需要使用 openssl 之类的工具将密钥从 pkcs1 转换为 pcks8
# openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs1.key -out pkcs8.key
或者,您可以使用 Bouncycastle 加载密钥。请参阅在 JAVA 中读取格式为 PKCS1 的 RSA 私钥
我不知道为什么它在 Oreo 中有效,即使没有记录https://developer.android.com/reference/java/security/spec/PKCS8EncodedKeySpec
推荐阅读
- html - HTML弹出菜单防止溢出容器
- java - 当我运行应用程序时,Android Studio Grid View 不显示
- javascript - Angular @Input() 不更新子用户界面
- app-inventor - 在 MIT App Inventor 中动态创建多个按钮
- python - 正则表达式替换python中数据框内的列表
- flutter - 在某个字符之后将字符串修剪为一定数量的字符的正确方法是什么?
- .htaccess - .htaccess “内部服务器错误”添加 / 到 URL
- mongodb - Mongo : find() 中的自定义 system.js,如查询
- r - R - 使用多因子水平绘制问卷中每个问题的答案的正确性
- php - 如何在连接时设置 pdo 时区