Извлечение закрытого ключа из pkcs12 и шифрование текста

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

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 (); возвращает ноль. Но когда я сам создаю закрытый ключ с помощью этой команды:

openssl genrsa -out privkey.pem 2048

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

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

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

1 ответ

Решение

Я не знаю, что не так с вашим кодом, но у меня есть код, который читает вещи из хранилища ключей. Я считал файл в экземпляр 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 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 ...]
Другие вопросы по тегам