Шифрование RSA с открытым ключом с кодировкой base64 в Android

Как сделать RSA-шифрование байтового массива с открытым ключом с кодировкой base-64?

Прочитав пару статей (google search) о том, как сделать шифрование RSA в Java, нашел следующий фрагмент

public byte[] rsaEncrypt(byte[] data) { PublicKey pubKey = readKeyFromFile("/public.key"); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] cipherData = cipher.doFinal(src); return cipherData; } 

У меня есть открытый ключ как кодированная base64 строка (126 символов), как мне создать «PublicKey» с кодированной строкой и использовать ее с Cipher.

Ваша строка base64 может быть X509EncodedKeySpec. Я могу только догадываться. Если это так, вы должны base64 декодировать строку, чтобы получить byte [] . Затем X509EncodedKeySpec из этого byte [] . Затем создайте экземпляр RSA KeyFactory и используйте метод generatePublic() этого KeyFactory для получения PublicKey . Затем этот открытый ключ можно передать в Cipher.init() .

Примечание: для выполнения декодирования base64 используется либо кодек apache commons , либо декодер Harder base64 .

ОБНОВЛЕНИЕ 8 марта 2017 года. В новостях более поздних, чем никогда, Java 8 теперь включает в себя класс кодирования / декодирования Base64, java.util.Base64

Это то, как вы можете создать парную партию Public и Private ниже, это функция для их хранения на жестком диске

 enter code here public static void GenerateKeyPair() { try{ KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(2048); KeyPair kp = kpg.genKeyPair(); KeyFactory fact = KeyFactory.getInstance("RSA"); RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(), RSAPublicKeySpec.class); RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(), RSAPrivateKeySpec.class); saveToFile("public.key", pub.getModulus(), pub.getPublicExponent()); saveToFile("private.key", priv.getModulus(), priv.getPrivateExponent()); }catch(Exception e){ System.out.println(e.getMessage()); } } public static void saveToFile(String fileName, BigInteger mod, BigInteger exp) throws Exception { ObjectOutputStream oout = new ObjectOutputStream( new BufferedOutputStream(new FileOutputStream(fileName))); try { oout.writeObject(mod); oout.writeObject(exp); } catch (Exception e) { throw new Exception("error", e); } finally { oout.close(); } }