Импорт зашифрованной пары ключей PEM в java с использованием bouncycastle

Я пишу программу, которая использует RSA для различных задач.
Я знаю, как сгенерировать и записать пару ключей в файл, но я не могу загрузить зашифрованную пару ключей (AES-256-CFB) в объект KeyPair.

Итак, возникает вопрос: как мне загрузить / расшифровать зашифрованную пару ключей PEM как объект java.security.KeyPair с помощью библиотеки BouncyCastle?

Спасибо.

Код генерации / экспорта:

public void generateKeyPair(int keysize, File publicKeyFile, File privateKeyFile, String passphrase) throws FileNotFoundException, IOException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException {
    SecureRandom random = new SecureRandom();
    KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");

    generator.initialize(keysize, random);

    KeyPair pair = generator.generateKeyPair();
    Key pubKey = pair.getPublic();

    PEMWriter pubWriter = new PEMWriter(new FileWriter(publicKeyFile));
    pubWriter.writeObject(pubKey);
    pubWriter.close();
    PEMWriter privWriter = new PEMWriter(new FileWriter(privateKeyFile));
    if (passphrase == null) {
        privWriter.writeObject(pair);
    } else {
        PEMEncryptor penc = (new JcePEMEncryptorBuilder("AES-256-CFB"))
                .build(passphrase.toCharArray());

        privWriter.writeObject(pair, penc);
    }
    privWriter.close();
}

person Lando    schedule 26.03.2013    source источник
comment
Почему у вас есть ключи AES для задач RSA?   -  person user207421    schedule 28.09.2020
comment
@MarquisofLorne Он хочет зашифровать закрытый ключ RSA для хранения его в файле.   -  person f9c69e9781fa194211448473495534    schedule 28.09.2020


Ответы (1)


Я предполагаю, что вы установили BouncyCastle в качестве поставщика безопасности, например, с помощью:

Security.addProvider(new BouncyCastleProvider());

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

Вот основные шаги:

  • Создание PEMParser для чтения из ключевого файла.

  • Создайте JcePEMDecryptorProvider с парольной фразой, необходимой для расшифровки ключа.

  • Создайте JcaPEMKeyConverter, чтобы преобразовать расшифрованный ключ в KeyPair.

KeyPair loadEncryptedKeyPair(File privateKeyFile, String passphrase)
      throws FileNotFoundException, IOException {
  FileReader reader = new FileReader(privateKeyFile);
  PEMParser parser = new PEMParser(reader);
  Object o = parser.readObject();

  if (o == null) {
    throw new IllegalArgumentException(
        "Failed to read PEM object from file!");
  }

  JcaPEMKeyConverter converter = new JcaPEMKeyConverter();

  if (o instanceof PEMKeyPair) {
    PEMKeyPair keyPair = (PEMKeyPair)o;
    return converter.getKeyPair(keyPair);
  }

  if (o instanceof PEMEncryptedKeyPair) {
    PEMEncryptedKeyPair encryptedKeyPair = (PEMEncryptedKeyPair)o;

    PEMDecryptorProvider decryptor =
        new JcePEMDecryptorProviderBuilder().build(passphrase.toCharArray());

    return converter.getKeyPair(encryptedKeyPair.decryptKeyPair(decryptor));
  }

  throw new IllegalArgumentException("Invalid object type: " + o.getClass());
}

Пример использования:

File privKeyFile = new File("priv.pem");
String passphrase = "abc";

try {
  KeyPair keyPair = loadEncryptedKeyPair(privKeyFile, passphrase);
} catch (IOException ex) {
  System.err.println(ex);
}

Ссылка: модульный тест BouncyCastle для синтаксического анализа ключей (ссылка).

person f9c69e9781fa194211448473495534    schedule 27.09.2020