2

さまざまなタスクに RSA を使用するプログラムを作成しています。
キーペアを生成してファイルに書き込む方法は知っていますが、暗号化された (AES-256-CFB) キーペアを KeyPair オブジェクトにロードできません。

問題は、BouncyCastle ライブラリを使用して、暗号化された PEM キー ペアを java.security.KeyPair オブジェクトとしてロード/復号化するにはどうすればよいかということです。

ありがとう。

生成/エクスポート コード:

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();
}
4

1 に答える 1

0

たとえば、次のように、BouncyCastle をセキュリティ プロバイダーとして設定していると想定しています。

Security.addProvider(new BouncyCastleProvider());

提供したコードは、秘密鍵用と公開鍵用の 2 つの鍵ファイルを作成します。ただし、公開鍵は暗黙的に秘密鍵に含まれているため、秘密鍵ファイルを読み取って鍵ペアを再構築するだけで済みます。

その後の主な手順は次のとおりです。

  • 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 単体テスト (リンク)。

于 2020-09-27T21:56:05.560 に答える