私はしばらくの間、この問題と戦ってきました。問題は、PEM 文字列をサーバーに送信する必要があることです。サーバーは、次の最終ステップを期待しています。
- タイプ 3DES または AES-256 の暗号化キー。
- そのキーは、RSA キーで暗号化されています。
- その出力は、Base64 および PEM 形式でエンコードされています。
これが私がこれまでに得たものです:
サーバーから取得した RSA キーに基づいて、Cipher を作成します。
Cipher rsa = Cipher.getInstance("RSA"); rsa.init(Cipher.ENCRYPT_MODE, (RSAPublicKey) obj);
後で、AES キーを作成します。
//IV. byte[] bytes = new byte[16]; SecureRandom random = new SecureRandom(); random.nextBytes(bytes); Map<String, byte[]> aes = new HashMap<String, byte[]>(); aes.put("IV", ConversionUtil.toHex(bytes, 8).getBytes()); KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(256); Key encryptionKey = keyGen.generateKey(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, new IvParameterSpec(ConversionUtil.toHex(bytes, 8).getBytes())); aes.put("key", cipher.doFinal(encryptionKey.getEncoded()));
これらすべてを使用して、PEM 文字列を作成します。
StringBuilder sb = new StringBuilder();
sb.append(StringUtils.repeat("-", 5));
sb.append("BEGIN PEM file");
sb.append(StringUtils.repeat("-", 5));
sb.append("\n");
sb.append("Proc-Type: 4,ENCRYPTED\n");
sb.append("DEK-Info: " + "AES-256-CBC" + "," + new String(aes.get("IV")) + "\n");
sb.append("");
sb.append(Base64.encode(rsa.doFinal(aes.get("key"))));
sb.append("\n");
sb.append(StringUtils.repeat("-", 5));
sb.append("END PEM file");
sb.append(StringUtils.repeat("-", 5));
そして、それをサーバーに送信すると、次のエラーがスローされます。
3936:エラー:0906D06C:PEM ルーチン:PEM_read_bio:開始行がありません:.\crypto\pem\pem_lib.c:698:
エラーの可視性はあまりありませんが、エラーは PEM の認識の欠如に関連しているように見えるため、プロセスで何か問題があるかどうかを確認したかったのです。
ご不明な点がございましたら、お知らせください。
ありがとう!