Исключение в генерации закрытого ключа от ключа RSA в устройстве зефира в Android - PullRequest
0 голосов
/ 21 января 2019

Я использую этот код для генерации секретного ключа из ключа 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 оно работает нормально, и я могу сгенерироватьзакрытый ключ успешно
  • Как решить эту проблему

1 Ответ

0 голосов
/ 21 января 2019

Заголовок -----BEGIN RSA PRIVATE KEY----- в файле PEM означает, что он содержит ключ PKCS # 1, но Java (и Android) не поддерживает pkcs1, поэтому вам необходимо преобразовать ключ из pkcs1 в pcks8 с помощью такого инструмента, как openssl

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

В качестве альтернативы вы можете загрузить ключ, используя Bouncycastle. См. Считывание закрытого ключа RSA формата PKCS1 в JAVA


Я не знаю, почему он работает в Oreo, возможно, основной поставщик будет поддерживать преобразование, даже если оно не задокументировано https://developer.android.com/reference/java/security/spec/PKCS8EncodedKeySpec

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...