私たちのアプリケーションの 1 つで、秘密鍵は BouncyCastle の PEMWriter を使用して保存されます。Java 7 には必要なものがすべて揃っているように見えるので、現在、BouncyCastle の依存関係を取り除くことができるかどうかを調査しています。唯一の問題は、データベースに格納されている秘密鍵を PEM でエンコードされた文字列として読み取ることができないことです (証明書/公開鍵は問題ありません)。
PEM でエンコードされた秘密キーの文字列をデータベースからファイルに保存すると、OpenSSL を実行して、次のようにキーを PKCS#8 形式に変換できます。
openssl pkcs8 -topk8 -inform PEM -outform DER \
-in private_key.pem -out private_key.der -nocrypt
結果の出力は、base64 でエンコードしてから、この Java/JCA コードを使用して読み取ることができます。
byte[] privateKeyBytes =
DatatypeConverter.parseBase64Binary(privateKeyDERcontents);
PrivateKey prKey =
KeyFactory.getInstance("RSA").
generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
この秘密鍵は、期待どおりに格納された公開鍵と一致します。つまり、平文から暗号文へ、またその逆に往復できます。
私が持っている質問は、どうにかして元の PEM エンコーディングを直接読み取ることができるかということです。
編集
以下は、BouncyCastle を使用して問題の文字列を読み取るコードです。
if (Security.getProvider("BC") == null) {
Security.addProvider(new BouncyCastleProvider());
}
PEMReader pemReader = new PEMReader(new StringReader(privateKeyPEM));
KeyPair keyPair = (KeyPair) pemReader.readObject();
PrivateKey key = keyPair.getPrivate();
「privateKeyPEM」は、データベース内の PEM でエンコードされた文字列です。それ以外の場合、この例は自己完結型です。興味深いことに、すでに JCA KeyPair オブジェクトを出力として使用しています。元の質問を言い換えると、PEMReader (そして、他のかなりの数の BouncyCastle クラス) に依存せずに、上記のコードと同等のことを行うことはできますか?