【问题标题】:Exception in generating the private key from RSA key in marshmallow device in android在android的棉花糖设备中从RSA密钥生成私钥的异常
【发布时间】:2019-06-14 11:38:03
【问题描述】:

我正在使用此代码从 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 中,它工作正常,我能够生成私钥 成功
  • 如何解决此问题

【问题讨论】:

    标签: java android rsa android-6.0-marshmallow android-8.0-oreo


    【解决方案1】:

    PEM 文件中的标头-----BEGIN RSA PRIVATE KEY----- 表示它包含一个PKCS#1 密钥,但Java(和Android)不支持pkcs1,因此您需要使用openssl 之类的工具将密钥从pkcs1 转换为pcs8

    # openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs1.key -out pkcs8.key
    

    您也可以使用 Bouncycastle 加载密钥。见Read RSA private key of format PKCS1 in JAVA


    我不知道为什么它在 Oreo 中有效,可能是底层提供者会支持转换,即使它没有记录在案 https://developer.android.com/reference/java/security/spec/PKCS8EncodedKeySpec

    【讨论】:

    • 我之前研究过这个问题,发现,是的,Bouncycastle 会默默地接受 PKCS1 RSAPrivateKey,所以就像 Oreo 默认使用 Bouncycastle 进行此操作,而 marshmallow 可能默认使用 openssl 提供程序。跨度>
    • 好点@JamesKPolk,这是唯一合理的解释。
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 2019-08-15
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多