(Android/Java)创建RSA私钥实例

(Android/Java)创建RSA私钥实例,java,android,encryption,rsa,private-key,Java,Android,Encryption,Rsa,Private Key,我正在尝试从pem文件在Android应用程序中创建PrivateKey实例以解密某些数据,但出现以下错误: java.lang.RuntimeException:错误:0c0890ba:ASN.1编码例程:asn1\u检查\u tlen:错误的\u标记 守则: // Read private key. InputStream is = context.getResources().openRawResource(R.raw.private_key); br = new BufferedRead

我正在尝试从pem文件在Android应用程序中创建PrivateKey实例以解密某些数据,但出现以下错误:

java.lang.RuntimeException:错误:0c0890ba:ASN.1编码例程:asn1\u检查\u tlen:错误的\u标记

守则:

// Read private key.
InputStream is = context.getResources().openRawResource(R.raw.private_key);
br = new BufferedReader(new InputStreamReader(is));
List<String> lines = new ArrayList<String>();
line = null;
while ((line = br.readLine()) != null)
    lines.add(line);

// Removes the first and last lines of the file (comments).
if (lines.size() > 1 && lines.get(0).startsWith("-----") &&
        lines.get(lines.size()-1).startsWith("-----")) {
    lines.remove(0);
    lines.remove(lines.size()-1);
}

// Concats the remaining lines to a single String.
StringBuilder sb = new StringBuilder();
for (String aLine: lines)
    sb.append(aLine);
String keyString = sb.toString();

// Converts the String to a PublicKey instance
byte[] keyBytes = Base64.decode(keyString, Base64.DEFAULT);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
mKey = keyFactory.generatePrivate(spec);
//读取私钥。
InputStream is=context.getResources().openRawResource(R.raw.private_key);
br=新的BufferedReader(新的InputStreamReader(is));
列表行=新的ArrayList();
行=空;
而((line=br.readLine())!=null)
行。添加(行);
//删除文件的第一行和最后一行(注释)。
if(lines.size()>1&&lines.get(0).startsWith(“----”)&&
lines.get(lines.size()-1).startsWith(“----”){
行。删除(0);
lines.remove(lines.size()-1);
}
//将剩余的行合并为一个字符串。
StringBuilder sb=新的StringBuilder();
用于(字符串对齐:行)
某人附加(aLine);
字符串keyString=sb.toString();
//将字符串转换为公钥实例
byte[]keyBytes=Base64.decode(keyString,Base64.DEFAULT);
PKCS8EncodedKeySpec spec=新的PKCS8EncodedKeySpec(keyBytes);
KeyFactory-KeyFactory=KeyFactory.getInstance(“RSA”);
mKey=keyFactory.generatePrivate(规范);

有什么帮助吗?

看来您的密钥不是PKCS8格式的。Java不支持加载PKCS#1格式的密钥。检查您的密钥是否为PKCS#8格式,验证它是否以
----开始私钥------
开头。如果它以
----开始RSA私钥------
开头,则需要将其转换为PKCS#8。请参见使用以下行:

    if (privateKeyString.contains("-----BEGIN PRIVATE KEY-----") || privateKeyString.contains("-----END PRIVATE KEY-----"))
        privateKeyString = privateKeyString.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "");


    if (privateKeyString.contains("-----BEGIN RSA PRIVATE KEY-----") || privateKeyString.contains("-----END RSA PRIVATE KEY-----"))
        privateKeyString = privateKeyString.replace("-----BEGIN RSA PRIVATE KEY-----", "").replace("-----END RSA PRIVATE KEY-----", "");

您的密钥是PKCS#8格式还是PKCS#1格式?它以
----开始私钥------
----开始RSA私钥------
开头?在第二种情况下,您需要将其转换为PCKS8您是对的pedrofb,如果您希望我将其设置为正确答案,请将您的评论作为答案。