暗号化(対称および非対称)メソッドに関する記事を読んだ後。多くの記事で、データの暗号化と復号化に秘密鍵が使用されていると書かれています。データの暗号化には公開鍵が使用されています。しかし、Java秘密鍵を使用してデータを暗号化および復号化できません(RSAアルゴリズムを使用しています)?可能であればリンクを提供してください。サポートされていない場合は、なぜサポートされていないのか回答してください。 tサポート?
//暗号化
Cipher encrypt=Cipher.getInstance("RSA");
encrypt.init(Cipher.ENCRYPT_MODE, privatekey);
byte[] encryptedMessage=encrypt.doFinal(msg.getBytes());
//復号化
Cipher decrypt=Cipher.getInstance("RSA");
decrypt.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage=decrypt.doFinal(encryptedMessage);
RSA暗号化を実行するには、公開鍵で暗号化し、秘密鍵で復号化する必要があります。さらに、should PKCS#1 v1.5互換のパディングや、可能な場合はOAEPパディングなど、明確に定義されたパディング方法を使用します。
RSA秘密鍵を使用した暗号化は、公開鍵を持っている人なら誰でも復号化できるため、意味がありません。基本的にべき乗剰余である「rawRSA」と呼ばれるものがありますが、これは署名を生成するためにのみ使用する必要があります別のパディングスキームを使用。その場合、公開鍵を持っているすべての人が署名を検証するために「復号化」する必要があります。
したがって、暗号化は次のとおりです。
// specify mode and padding instead of relying on defaults (use OAEP if available!)
Cipher encrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding");
// init with the *public key*!
encrypt.init(Cipher.ENCRYPT_MODE, publicKey);
// encrypt with known character encoding, you should probably use hybrid cryptography instead
byte[] encryptedMessage = encrypt.doFinal(msg.getBytes(StandardCharsets.UTF_8));
復号化は次のとおりです。
Cipher decrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding");
decrypt.init(Cipher.DECRYPT_MODE, privateKey);
String decryptedMessage = new String(decrypt.doFinal(encryptedMessage), StandardCharsets.UTF_8);
公開秘密鍵暗号化の仕組み:
公開秘密鍵のペアを生成する必要があります。秘密鍵はあなただけのものであり、公開鍵は信頼できる人に与えることができます。
キーペアを生成する方法は?
$ openssl genrsa -out private_key.pem 1024
$ openssl rsa -pubout -in private_key.pem -out public_key.pem
または、ここに移動してJava-> Java RSA で実行します。実行したら、戻ってさらに質問します。
秘密鍵で暗号化する場合、それは証明書と呼ばれます。また、公開鍵はクライアントに配布されるため、クライアントは公開鍵を開いて証明書の発行者を確認できます。クライアントが公開鍵で暗号化することにより、独自の署名を作成できるのと同じ方法です。サーバー/発行者が秘密鍵で復号化することで検証できるのと同じ方法です。
S:秘密鍵P:公開鍵
S +データ=証明書=>クライアント(公開鍵で開く/確認する)P +データ=署名=>サーバー/発行者(秘密鍵で開く/確認する)