
java rsa加密是什么?讓我們一起來了解一下吧!
java rsa加密是java中的一種非對稱加密算法。非對稱加密是指加密密鑰與加密秘鑰不一樣。我們經(jīng)常看見的非對稱加密算法有兩種,分別是rsa和dsa。
?
應(yīng)用rsa的時候我們一般需要公鑰與私鑰,但我們采用公鑰加密的時候,便使用私鑰解密;反之,采用私鑰加密的時候,便要使用公鑰進(jìn)行解密。在java中,我們先應(yīng)用genkeypair()函數(shù)產(chǎn)生公鑰與私鑰同時保存在map集合里面。接著,我們以產(chǎn)生的公鑰對明文進(jìn)行加密。針對已加密的密文,我們再利用私鑰對其解密。
實(shí)戰(zhàn)演練,具體步驟如下:
package?rsademo;
?
import?javax.crypto.Cipher;
import?java.nio.charset.StandardCharsets;
import?java.security.*;
import?java.security.spec.PKCS8EncodedKeySpec;
import?java.security.spec.X509EncodedKeySpec;
import?java.util.Base64;
?
/**
?*?@author?一只鯊go
?*?@title?RSA_Test
?*?@CreateTime?2021-05-13
?*/
?
?
public?class?RSA_Algorithm?{
????private?PrivateKey?privateKey;
????private?PublicKey?publicKey;
????private?static?String?algorithm?=?"RSA";
????private?static?String?signAlgorithm?=?"MD5withRSA";
?
????public?RSA_Algorithm()?throws?NoSuchAlgorithmException?{
????????//生成密鑰對對象
????????KeyPairGenerator?keyPairGenerator?=?KeyPairGenerator.getInstance(algorithm);
????????//生成密鑰對
????????KeyPair?keyPair?=?keyPairGenerator.generateKeyPair();
????????//生成公鑰
????????this.publicKey?=?keyPair.getPublic();
????????//生成私鑰
????????this.privateKey?=?keyPair.getPrivate();
?
?
????}
?
????/**
?????*?公鑰字符串還原為公鑰
?????*
?????*?@param?publicKeyString?公鑰字符串
?????*?@return?公鑰
?????*?@throws?Exception
?????*/
????public?Key?publicKeyStringToKey(String?publicKeyString)?throws?Exception?{
????????byte[]?publicBytes?=?Base64.getDecoder().decode(publicKeyString);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(algorithm);
????????PublicKey?publicKey?=?keyFactory.generatePublic(new?X509EncodedKeySpec(publicBytes));
????????return?publicKey;
????}
?
????/**
?????*?私鑰字符串還原為私鑰
?????*
?????*?@param?privateKeyString?私鑰字符串
?????*?@return?私鑰
?????*?@throws?Exception
?????*/
????public?PrivateKey?privateKeyStringToKey(String?privateKeyString)?throws?Exception?{
????????byte[]?privateBytes?=?Base64.getDecoder().decode(privateKeyString);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(algorithm);
????????PrivateKey?privateKey?=?keyFactory.generatePrivate(new?PKCS8EncodedKeySpec(privateBytes));
????????return?privateKey;
????}
?
????/**
?????*?返回公鑰字節(jié)數(shù)組
?????*
?????*?@return
?????*/
????public?byte[]?publicKeyEncoded()?{
????????return?this.publicKey.getEncoded();
????}
?
????/**
?????*?返回私鑰字節(jié)數(shù)組
?????*
?????*?@return
?????*/
????public?byte[]?privateKeyEncoded()?{
????????return?this.privateKey.getEncoded();
????}
?
????/**
?????*?公鑰byteToString轉(zhuǎn)碼
?????*
?????*?@return
?????*/
????public?String?publicKeyToString()?{
????????return?Base64.getEncoder().encodeToString(publicKeyEncoded());
????}
?
????/**
?????*?私鑰byteToString轉(zhuǎn)碼
?????*
?????*?@return
?????*/
????public?String?privateKeyToString()?{
????????return?Base64.getEncoder().encodeToString(privateKeyEncoded());
????}
?
????/**
?????*?公鑰加密
?????*
?????*?@param?input?????明文
?????*?@param?publicKey?公鑰
?????*?@return?密文字符串
?????*?@throws?Exception
?????*/
????public?String?pkEncoded(String?input,?String?publicKey)?throws?Exception?{
????????byte[]?bytes?=?input.getBytes(StandardCharsets.UTF_8);
????????Cipher?cipher?=?Cipher.getInstance(algorithm);
????????cipher.init(Cipher.ENCRYPT_MODE,?publicKeyStringToKey(publicKey));
????????byte[]?cipherText?=?cipher.doFinal(bytes);
????????return?Base64.getEncoder().encodeToString(cipherText);
????}
?
????/**
?????*?私鑰解密
?????*
?????*?@param?cipherText?密文
?????*?@param?privateKey?私鑰
?????*?@return?明文字符串
?????*?@throws?Exception
?????*/
????public?String?skDecoded(String?cipherText,?String?privateKey)?throws?Exception?{
????????byte[]?cipherbytes?=?Base64.getDecoder().decode(cipherText);
????????Cipher?cipher?=?Cipher.getInstance(algorithm);
????????cipher.init(Cipher.DECRYPT_MODE,?privateKeyStringToKey(privateKey));
????????byte[]?input?=?cipher.doFinal(cipherbytes);
????????return?new?String(input);
?
????}
?
????/**
?????*?數(shù)字簽名:私鑰加密
?????*
?????*?@param?signature??簽名明文字符串
?????*?@param?privateKey?私鑰字符串
?????*?@return?簽名字符串
?????*?@throws?Exception
?????*/
????public?String?skEncoded(String?signature,String?privateKey)?throws?Exception?{
????????Signature?signature1?=?Signature.getInstance(signAlgorithm);
????????signature1.initSign(privateKeyStringToKey(privateKey));
????????signature1.update(signature.getBytes(StandardCharsets.UTF_8));
????????byte[]?sign?=?signature1.sign();
????????return?Base64.getEncoder().encodeToString(sign);
????}
?
?????/**
?????*?判斷簽名:公鑰解密
?????*?@param?input
?????*?@param?signDate?簽名密文字符串
?????*?@param?publicKey?公鑰
?????*?@return?boolen
?????*?@throws?Exception
?????*/
????public?boolean?pkDecoded(String?input,String?signDate,String?publicKey)throws?Exception?{
?
????????Signature??signature?=?Signature.getInstance(signAlgorithm);
????????signature.initVerify(publicKeyStringToKey(publicKey));
????????signature.update(input.getBytes(StandardCharsets.UTF_8));
?
????????return?signature.verify(Base64.getDecoder().decode(signDate));
????}
?
}?以上就是小編今天的分享了,希望可以幫助到大家。
