5

ファイルから公開 ssh rsa キー (id_rsa.pub) を読み込もうとしています:

X509EncodedKeySpec spec = new X509EncodedKeySpec(readBytes(keyFile));
return (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(spec);

しかし、私は得る

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: 無効なキー形式

このファイルを RSAPublicKey にロードする方法は?

4

2 に答える 2

8

x509 でエンコードされたデータは、DER 形式である必要があります。このような鍵は、OpenSSL を使用して作成できます (注: OpenSSL の復習については、http://codeartisan.blogspot.com/2009/05/public-key-cryptography-in-java.htmlの功績によるものです)。

キーを生成するには、次を使用します。

$ openssl genrsa -out private_key.pem 2048

または、パスフレーズを使用して:

$ openssl genrsa -aes256 -out private_key.pem 2048

または、ssh-keygen を使用して (例に従って):

$ ssh-keygen -t rsa -C "myEmail" -I X.509

キーを「private_key.pem」として保存したと仮定します。公開キーを DER 形式で生成します。

$ openssl rsa -in private_key.pem -pubout -outform DER -out tst_public.der

ファイルの内容を含むバイト配列が X509EncodedKeySpec で受け入れられるようになりました。

秘密鍵をロードする場合は、OpenSSL を使用して秘密鍵の暗号化されていないコピーを保存します (安全でない環境ではこれを行わないでください)。

$ openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt


You can then pass this file as a byte array to `PKCS8EncodedKeySpec`.

Java で鍵ペアを生成することもできます。

private static int rsabits = 2048; // or higher, if you've got the cpu*time
public static SecureRandom sr = new SecureRandom(); // reseed periodically 

public static KeyPair newKeyPair() throws NoSuchAlgorithmException {
    KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
    generator.initialize(rsabits, sr);
    return generator.generateKeyPair();
}

次に、 と を使用KeyPair.getPublic()KeyPair.getPrivate()てキーにアクセスできます。次のようなバイト配列として保存またはロードできます。

public static byte[] pubKeyToBytes(PublicKey key){
    return key.getEncoded(); // X509 for a public key
}
public static byte[] privKeyToBytes(PrivateKey key){
    return key.getEncoded(); // PKCS8 for a private key
}
public static PublicKey bytesToPubKey(byte[] bytes) throws InvalidKeySpecException, NoSuchAlgorithmException{
    return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(bytes));
}
public static PrivateKey bytesToPrivKey(byte[] bytes) throws InvalidKeySpecException, NoSuchAlgorithmException{
    return KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(bytes));
}
于 2013-07-07T19:10:31.513 に答える