Я работаю над клиентским сервером.
Где я получаю 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(); }