2013-08-30 1 views
2

У меня есть .p12 файл, я извлекаю закрытый ключ с помощью openssl, у меня есть пароль для его извлечения.Извлечение частного ключа из pkcs12 и текстовое шифрование

openssl pkcs12 -in my.p12 -nocerts -out privateKey.pem 

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

public static void main(String[] args) throws Exception { 
     Security.addProvider(new BouncyCastleProvider()); 
     KeyPair keyPair = readKeyPair(privateKey, "testpassword".toCharArray()); 
     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic()); 
     byte[] textEncrypted = cipher.doFinal("hello world".getBytes()); 
     System.out.println("encrypted: "+new String(textEncrypted)); 
     cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate()); 
     byte[] textDecrypted = cipher.doFinal(textEncrypted); 
     System.out.println("decrypted: "+new String(textDecrypted)); 
    } 

    private static KeyPair readKeyPair(File privateKey, char[] keyPassword) throws IOException { 
     FileReader fileReader = new FileReader(privateKey); 
     PEMReader r = new PEMReader(fileReader, new DefaultPasswordFinder(keyPassword)); 
     try { 
      return (KeyPair) r.readObject(); // this returns null 
     } catch (IOException ex) { 
      throw new IOException("The private key could not be decrypted", ex); 
     } finally { 
      r.close(); 
      fileReader.close(); 
     } 
    } 

r.readObject(); возврат null. Но когда я сам создаю секретный ключ по этой команде:

openssl genrsa -out privkey.pem 2048 

Приведенный выше код работает нормально.

  • Как я могу извлечь закрытый ключ из файла p12 правильно?
  • Или есть ли способ использовать файл p12 для шифрования/дешифрования текста без извлечения из командной строки?

Я знаю, что это просто PKCS#12 - это просто архивный файл, в котором хранятся ключи.

ответ

2

Я не знаю, что не так с вашим кодом, но у меня есть код, который читает материал из магазина ключей. Я прочитал файл в экземпляр KeyStore и затем, при необходимости, обращаюсь к ключу или записи. Вот некоторые из соответствующих вызовов:

char[] password; 
String alias; 
java.security.KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC"); 
keyStore.load(inputStream, password); 
java.security.PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password); 
java.security.keystore.PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) keyStore.getEntry(alias, new KeyStore.PasswordProtection(password)); 

Чтобы найти псевдоним записи, которую вы заинтересованы, я предлагаю использовать Keytool (поставляется с JDK):

keytool -list -v -keystore keystore.pkcs12 -storetype pkcs12 

Вам будет предложено для keystore password, а затем получите следующую информацию:

Keystore type: PKCS12 
Keystore provider: SunJSSE 

Your keystore contains 1 entry 

Alias name: thealias 
Creation date: Aug 30, 2013 
Entry type: PrivateKeyEntry 
Certificate chain length: 2 
[... lots of info about the certificates deleted ...] 
+0

Hi Rob благодарит вас за ответ. Раньше я пробовал. у моего хранилища ключей нет каких-либо псевдонимов. есть ли способ выяснить путь. У меня есть сертификат вместе с файлом p12. . – user2662294

+0

Добавлены некоторые подробности о включении содержимого хранилища ключей, так что, возможно, вы можете найти псевдоним, который находится на входе, что вы заинтересованы в – Rob

+0

Он показывает мне это: 'типа хранилища ключей: PKCS12 поставщика хранилища ключей: SunJSSE Ваших keystore содержит 0 записей', BTW, у меня есть * .cer, файл вместе с моим файлом .p12. что-то с этим связано? Благодаря! – user2662294

Смежные вопросы