web-dev-qa-db-ja.com

弾む城:PEMReader => PEMParser

PEM証明書のような

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B9846B5D1803E.....

bC 1.46を使用して、次のコードでキーペアを抽出します。

int myFunc(String pemString, char [] password) {

    ByteArrayInputStream tube = new ByteArrayInputStream(pemString.getBytes());

    Reader fRd = new BufferedReader(new InputStreamReader(tube));

    PEMReader pr = new PEMReader(fRd, new Password (password), "BC");

     try {
            Object o = pr.readObject();
            if (o instanceof KeyPair)
    .....

BC 1.48をインストールしたところ、PEMReaderは廃止予定であり、PEMParserに置き換える必要があると言われました。

私の問題は、私の知る限りです。PEMParserにはパスワードの場所がありません。

誰かが私のコードをPEMParserバージョンに移行する方法の例を教えてもらえますか?

20
stackanovist

私は同じ問題を解決する必要があるだけで答えは見つかりませんでした。それで私はBC APIの研究に少し時間を費やし、私に役立つ解決策を見つけました。 myFuncメソッドにpemStringパラメータの代わりにprivateKeyFileNameパラメータがあるように、ファイルから秘密鍵を読み取る必要がありました。

BC 1.48およびPEMParserの使用:

int myFunc(String privateKeyFileName, char [] password) {
     File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format
     PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
     Object object = pemParser.readObject();
     PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password);
     JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
     KeyPair kp;
     if (object instanceof PEMEncryptedKeyPair) {
        System.out.println("Encrypted key - we will use provided password");
        kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));
    } else {
        System.out.println("Unencrypted key - no password needed");
        kp = converter.getKeyPair((PEMKeyPair) object);
    }
}
35
xwatch

bcpkix-jdk15onのバージョン1.55の場合、復号化コードは次のように変更されます。

kp = ((PEMEncryptedKeyPair) object).decryptKeyPair(decryptorProvider);

これが上記の回答の間違いなのか、バージョン間のAPIの違いなのかは確認しませんでした。

1
jonas