web-dev-qa-db-ja.com

Java)の秘密鍵による暗号化と復号化

暗号化(対称および非対称)メソッドに関する記事を読んだ後。多くの記事で、データの暗号化と復号化に秘密鍵が使用されていると書かれています。データの暗号化には公開鍵が使用されています。しかし、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);
9
Nadendla

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);
13
Maarten Bodewes

公開秘密鍵暗号化の仕組み:

  1. 秘密鍵で何かを暗号化すると、公開鍵を持っている人なら誰でもそれを復号化できます。
  2. 公開鍵で何かを暗号化した場合、それを復号化できるのは秘密鍵だけです。

公開秘密鍵のペアを生成する必要があります。秘密鍵はあなただけのものであり、公開鍵は信頼できる人に与えることができます。

キーペアを生成する方法は?

$ openssl genrsa -out private_key.pem 1024
$ openssl rsa -pubout -in private_key.pem -out public_key.pem

または、ここに移動してJava-> Java RSA で実行します。実行したら、戻ってさらに質問します。

6
dharr

秘密鍵で暗号化する場合、それは証明書と呼ばれます。また、公開鍵はクライアントに配布されるため、クライアントは公開鍵を開いて証明書の発行者を確認できます。クライアントが公開鍵で暗号化することにより、独自の署名を作成できるのと同じ方法です。サーバー/発行者が秘密鍵で復号化することで検証できるのと同じ方法です。

S:秘密鍵P:公開鍵

S +データ=証明書=>クライアント(公開鍵で開く/確認する)P +データ=署名=>サーバー/発行者(秘密鍵で開く/確認する)