.pem ファイルに保存されている公開鍵と秘密鍵を読み取る小さなコードを書いています。次のコマンドを使用してキーを生成しています。
以下のコマンドでキーのペアを生成します。
$openssl genrsa -out mykey.pem 2048
秘密鍵を生成するこのコマンド
$openssl pkcs8 -topk8 -inform PEM -outform PEM -in mykey.pem \
-out private_key.pem -nocrypt
このコマンドで公開鍵を取得します。
$ openssl rsa -in mykey.pem -pubout -outform DER -out public_key.der
秘密鍵と公開鍵をそれぞれ読み取る 2 つのメソッドを作成しました。
public PrivateKey getPemPrivateKey(String filename, String algorithm) throws Exception {
File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) f.length()];
dis.readFully(keyBytes);
dis.close();
String temp = new String(keyBytes);
String privKeyPEM = temp.replace("-----BEGIN PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END PRIVATE KEY-----", "");
//System.out.println("Private key\n"+privKeyPEM);
Base64 b64 = new Base64();
byte [] decoded = b64.decode(privKeyPEM);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
KeyFactory kf = KeyFactory.getInstance(algorithm);
return kf.generatePrivate(spec);
}
public PublicKey getPemPublicKey(String filename, String algorithm) throws Exception {
File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) f.length()];
dis.readFully(keyBytes);
dis.close();
String temp = new String(keyBytes);
String publicKeyPEM = temp.replace("-----BEGIN PUBLIC KEY-----\n", "");
publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");
Base64 b64 = new Base64();
byte [] decoded = b64.decode(publicKeyPEM);
X509EncodedKeySpec spec =
new X509EncodedKeySpec(decoded);
KeyFactory kf = KeyFactory.getInstance(algorithm);
return kf.generatePublic(spec);
}
やり方が稚拙な気がします。インターネット上でそれを行うより良い方法を見つけることができませんでした。一般的なケースを処理するために同じコードを書く最良の方法を誰かが教えてくれますか? サードパーティのライブラリは一切使用したくありません。
私は歌唱/暗号化に関する非常に基本的な知識を持っており、Java セキュリティ API をほとんど使用していません。ですから、私がどこかで意味をなしていない場合は、指摘してください。