Intereting Posts
Есть ли способ безопасно переопределить класс в PHP? Как сохранить данные регистрации в двух таблицах с помощью проверки подлинности JWT в CakePHP 3 .htaccess – Как перенаправить все URL-адреса в url.php, кроме index.php API календаря Google, хранящий код или токен доступа PDOException «не удалось найти драйвер» в php «пройти через» загрузку php на s3 амазонки? Создайте ObjectID объекта MongoDB с даты в прошлом с помощью драйвера PHP Изменение роли пользователя при покупке определенных продуктов при завершении заказа Какой лучший метод PHP для уменьшения размера изображения без потери качества Укладка тройных выражений Ошибка внутреннего сервера CodeIgniter PHP Apache 500 Создайте SOAP-запрос с атрибутом элемента с помощью Zend_Soap_Client и stdObject Попытка понять пароль_verify PHP [PHP Предупреждение: mail (): «sendmail_from» не установлен в php.ini или пользовательский заголовок «From:» отсутствует Обнаружение, если два окна браузера открыты для одного и того же сайта

Преобразование PHP RSA PublicKey в Android PublicKey

Я работаю над клиентским сервером.

Где я получаю PublicKey в этом формате

введите описание изображения здесь

как я сохранил его в String.

Теперь я хочу использовать этот ключ в своем Android (Java-код), как я могу это использовать?

Сначала вам нужно сгенерировать открытый ключ из предоставленного вами формата pem, вот мой метод для этого:

/** * * @param PEMString -A file/string in .pem format with a generated RSA key (with "des3", using "openssl genrsa".) * @param isFilePath - If it's a file path or a string * @return java.security.PublicKey * @throws IOException -No key found * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException * * @author hsigmond */ private static PublicKey getPublicKeyFromPemFormat(String PEMString, boolean isFilePath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { BufferedReader pemReader = null; if (isFilePath) { pemReader = new BufferedReader(new InputStreamReader( new FileInputStream(PEMString))); } else { pemReader = new BufferedReader(new InputStreamReader( new ByteArrayInputStream(PEMString.getBytes("UTF-8")))); } StringBuffer content = new StringBuffer(); String line = null; while ((line = pemReader.readLine()) != null) { if (line.indexOf("-----BEGIN PUBLIC KEY-----") != -1) { while ((line = pemReader.readLine()) != null) { if (line.indexOf("-----END PUBLIC KEY") != -1) { break; } content.append(line.trim()); } break; } } if (line == null) { throw new IOException("PUBLIC KEY" + " not found"); } Log.i("PUBLIC KEY: ", "PEM content = : " + content.toString()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decode(content.toString(), Base64.DEFAULT))); } 

И вот как я использую его для чтения (декодирования) контента, подписанного с предоставленным открытым ключом.

 /** * * @param PEMString -A file/string in .pem format with a generated RSA key (with "des3", using "openssl genrsa".) * @param content * @return String value of content Decoded * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException * @throws IOException * @throws NoSuchProviderException * @throws NoSuchPaddingException * @throws InvalidKeyException * @throws IllegalBlockSizeException * @throws BadPaddingException * * @author hsigmond */ public static String getContentWithPublicKeyFromPemFormat(String PEMString, String content,boolean isFilePath) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { PublicKey publicKey = getPublicKeyFromPemFormat(PEMString,isFilePath); if (publicKey != null) Log.i("PUBLIC KEY: ", "FORMAT : " + publicKey.getFormat() + " \ntoString : " + publicKey.toString()); byte[] contentBytes = Base64.decode(content, Base64.DEFAULT); byte[] decoded = null; Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");//BC=BouncyCastle Provider cipher.init(Cipher.DECRYPT_MODE, publicKey); decoded = cipher.doFinal(contentBytes); return new String(decoded, "UTF-8"); } 

Существует проект под названием «bouncycastle», который мы используем на j2me, но он также работает на Android. его можно использовать для обработки сертификатов openssl.

bouncycastle.org

Реализация Java KeyStore:

import java.security.cert.Certificate import java.security.KeyStore

и readme LOT, потому что ключи openssl напрямую не поддерживаются java, которые привносят свои собственные механизмы.

Пример Java для материалов KeyStore:

 byte[] certData = ... /* create KeyStore */ KeyStore ks = KeyStore.getInstance("JKS", "SUN"); /* load key store (initialization */ ks.load(null, null); /* create CertificateFactory */ CertificateFactory cf = CertificateFactory.getInstance("X509"); /* create certificate from input stream */ Certificate cert; /* provide cert data */ ByteArrayInputStream in = new ByteArrayInputStream(makeCert(certData)); private static byte[] makeCert(byte[] data) { String headline = "-----BEGIN CERTIFICATE-----"; String footline = "-----END CERTIFICATE-----"; String certStr = headline; for (int i = 0; i < data.length; i++) { if (i%64 == 0) { certStr += "\n"; } certStr += (char)data[i]; } if ((data.length-1)%64 != 0) { certStr += "\n"; } certStr += footline; return certStr.getBytes(); }