0

最初に、私はセキュリティについてこれを尋ねようとしました - 私はいくつかの賛成票を獲得しましたが、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の同等のコマンドラインステートメントは何ですか? また、弾む城などの外部パッケージを使用することはオプションではないことに注意してください。

4

1 に答える 1