Я несколько дней пытался сделать это без успеха.
В StackOverflow есть много подобных вопросов, и даже два из них точно такие же, как мои, но не ответили и не были решены: 1) Преобразование PHP RSA PublicKey в Android PublicKey 2) Android: как расшифровать зашифрованный файл openssl с ключом RSA?
Мой сценарий: У меня есть текст, зашифрованный с помощью RSA (не зашифрованный мной). У меня есть файл public.key в моей папке res/raw с открытым ключом, необходимым для его расшифровки (открытый ключ, связанный с закрытым ключом, используемым для шифрования сообщения), с таким форматом, как в следующем примере:
Я вижу много примеров того, как расшифровать текст RSA, например следующий:
public static byte[] decryptRSA( PublicKey key, byte[] text) throws Exception
{
byte[] dectyptedText = null;
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
dectyptedText = cipher.doFinal(text);
return dectyptedText;
}
Но мой вопрос: как получить правильный экземпляр PublicKey из файла? Нет примеров этого.
Если я просто попробую:
InputStream is = getResources().openRawResource(R.raw.public);
DataInputStream dis = new DataInputStream(is);
byte [] keyBytes = new byte [(int) is.available()];
dis.readFully(keyBytes);
dis.close();
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(spec);
Я получаю InvalidKeyException в возвращаемом предложении. Должен ли я декодировать Hex или Base64? Не проблема в первой и последней строках файла открытого ключа (те, у кого есть "---- BEGIN PUBLIC KEY ----" и т.д.)?
Возможно, мы можем получить ответ об этом в первый раз в StackOverflow: -)