繁体   English   中英

在android中的marshmallow设备中从RSA密钥生成私钥的例外情况

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM