2

私たちのアプリケーションの 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 クラス) に依存せずに、上記のコードと同等のことを行うことはできますか?

4

1 に答える 1

-2

PEM ファイル内のキーは既に PKCS#8 形式で保存されているため、パスワードで暗号化されていない場合は、ヘッダー (-----BEGIN RSA PRIVATE KEY-----)、Base64 デコード入力、および必要なバイトを取得します。

于 2013-01-09T10:17:17.800 に答える