[英]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);
公鑰私鑰加密的工作原理:
您必須生成公鑰私鑰對。 私鑰僅供您使用,公鑰可以提供給您信任的人。
如何生成密鑰對?
$ 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.