簡體   English   中英

使用Java中的私鑰進行加密和解密

[英]Encryption and decryption with private key in Java

在我閱讀了有關密碼學(對稱和非對稱)方法的文章之后。很多文章都說私鑰用於加密和解密數據。公鑰用於加密數據。但是當我嘗試用Java開始實現時我不能能夠使用私鑰來加密和解密數據(我正在使用RSA算法)? 如果有可能請給我一個鏈接。如果它不支持,請回答為什么它不支持?

//加密

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加密,您需要使用公鑰加密並使用私鑰解密。 此外,您應該使用定義明確的填充方法,例如PKCS#1 v1.5兼容填充或 - 如果可用 - OAEP填充。

使用RSA私鑰進行加密毫無意義,因為任何擁有公鑰的人都可以解密。 有一種稱為“原始RSA”的東西,它基本上是模冪運算,但只能與另一個填充方案一起使用來生成簽名。 在這種情況下,您希望每個擁有公鑰的人都“解密”以驗證簽名。

更多信息在這里這里

所以加密是:

// 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);

公鑰私鑰加密的工作原理:

  1. 如果您使用私鑰加密某些內容,任何擁有您公鑰的人都可以對其進行解密。
  2. 如果您使用公鑰加密某些內容,則只有您的私鑰可以對其進行解密。

您必須生成公鑰私鑰對。 私鑰僅供您使用,公鑰可以提供給您信任的人。

如何生成密鑰對?

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

或者在這里用java做 - > JAVA RSA當你這樣做時,回過頭來問更多的問題

使用私鑰加密時,它稱為證書。 並且您的公鑰將分發給客戶端,以便他們可以打開它並驗證證書的頒發者。 客戶端可以通過使用公鑰加密來創建自己的簽名。 服務器/發行者可以通過使用私鑰解密來驗證它。

S:私鑰P:公鑰

S + Data = Certificate => Client(用公鑰打開/驗證它)P + Data = Signature => Server / Issuer(用私鑰打開/驗證它)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM