最初に、私はセキュリティについてこれを尋ねようとしました - 私はいくつかの賛成票を獲得しましたが、1週間答えがなかったようです. これはopensslに関連していることは理解していますが、Java KeyPairGeneratorオブジェクトの使用に起因するため、スタックオーバーフローに有効である可能性があります. 以下のコードを参照してください。
プログラム内で公開/秘密鍵を生成するためにJavaのKeyPairGeneratorを使用して、ファイルを暗号化および復号化できるようにしています(Javaの暗号化/復号化メソッドも使用しています)。これらの公開秘密鍵ペアを生成するために openssl を使用できるようにしたいのですが、コマンド ラインで生成された openssl キーを使用すると、ファイルを復号化するときにパディング例外が発生し続けます。たとえば、Java の KeyPairGenerator を使用する代わりに、openssl を使用してキーを生成しようとしています。
openssl rsa -in keypair.pem -outform DEF -pubout -out public.der
openssl pkcs8 -topk8 -nocrypt -in keypair.pem -outform DER -out private.der
DER ファイルを使用してファイルを暗号化/復号化しようとする場所。最終的に、私が試したすべてのキー形式で問題が発生するようです。
これは、openssl コマンドのキーの形式が Java の KeyPairGenerator の動作と一致しないことを意味していると思います。これが私のキー生成コードのスニペットです:
public void createPublicPrivateKeys() throws IOException, NoSuchAlgorithmException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
logger.info("Password to encrypt the private key: ");
String password = in.readLine();
logger.info("Generating an RSA keypair.");
// Create an RSA key key pair
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(4096);
KeyPair keyPair = keyPairGenerator.genKeyPair();
logger.info("Done generating the keypair.\n");
// Write public key out to a file
String publicKeyFilename = "publicKey.der";
logger.info("Public key filename: " + publicKeyFilename);
// Get encoded form of the public key for future usage -- this is X.509 by default.
byte[] publicKeyBytes = keyPair.getPublic().getEncoded();
// Write the encoded public key
FileOutputStream fos = new FileOutputStream(publicKeyFilename);
fos.write(publicKeyBytes);
fos.close();
String privateKeyFilename = "privateKey.der";
logger.info("Private key filename: " + privateKeyFilename);
// Get the encoded form -- PKCS#8 by default.
byte[] privateKeyBytes = keyPair.getPrivate().getEncoded();
// Encrypt the password
byte[] encryptedPrivateKeyBytes = new byte[0];
try {
encryptedPrivateKeyBytes = passwordEncrypt(password.toCharArray(), privateKeyBytes);
} catch (Exception e) {
e.printStackTrace();
}
fos = new FileOutputStream(privateKeyFilename);
fos.write(encryptedPrivateKeyBytes);
fos.close();
}
javaの標準KeyPairGeneratorを使用するopensslの同等のコマンドラインステートメントは何ですか? また、弾む城などの外部パッケージを使用することはオプションではないことに注意してください。