
java rsa私鑰加密是什么?讓我們一起來了解一下吧!
java rsa私鑰加密是一種加密算法。私鑰加密算法是用私鑰來進行加密與解密信息。私鑰加密也被稱作對稱加密,原因是加密與解密使用的秘鑰是同一個。

RSA加密需要注意的事項如下:
1.?首先產生公鑰與私鑰
2.?設計加密與解密的算法
3.?私鑰加密的數據信息只能由公鑰可以解密
4.?公鑰加密的數據信息只能由私鑰可以解密
實戰演練,具體步驟如下:
public?class?RsaCryptTools?{
????private?static?final?String?CHARSET?=?"utf-8";
????private?static?final?Base64.Decoder?decoder64?=?Base64.getDecoder();
????private?static?final?Base64.Encoder?encoder64?=?Base64.getEncoder();
?
????/**
?????*?生成公私鑰
?????*?@param?keySize
?????*?@return
?????*?@throws?NoSuchAlgorithmException
?????*/
????public?static?SecretKey?generateSecretKey(int?keySize)?throws?NoSuchAlgorithmException?{
????????//生成密鑰對
????????KeyPairGenerator?keyGen?=?KeyPairGenerator.getInstance("RSA");
????????keyGen.initialize(keySize,?new?SecureRandom());
????????KeyPair?pair?=?keyGen.generateKeyPair();
????????PrivateKey?privateKey?=?pair.getPrivate();
????????PublicKey?publicKey?=?pair.getPublic();
????????//這里可以將密鑰對保存到本地
????????return?new?SecretKey(encoder64.encodeToString(publicKey.getEncoded()),?encoder64.encodeToString(privateKey.getEncoded()));
????}
????/**
?????*?私鑰加密
?????*?@param?data
?????*?@param?privateInfoStr
?????*?@return
?????*?@throws?IOException
?????*?@throws?InvalidCipherTextException
?????*/
????public?static?String?encryptData(String?data,?String?privateInfoStr)?throws?IOException,?InvalidKeySpecException,?NoSuchAlgorithmException,?InvalidKeyException,?NoSuchPaddingException,?BadPaddingException,?IllegalBlockSizeException?{
?
????????Cipher?cipher?=?Cipher.getInstance("RSA/ECB/PKCS1Padding");
????????cipher.init(Cipher.ENCRYPT_MODE,?getPrivateKey(privateInfoStr));
????????return?encoder64.encodeToString(cipher.doFinal(data.getBytes(CHARSET)));
????}
?
????/**
?????*?公鑰解密
?????*?@param?data
?????*?@param?publicInfoStr
?????*?@return
?????*/
????public?static?String?decryptData(String?data,?String?publicInfoStr)?throws?NoSuchPaddingException,?NoSuchAlgorithmException,?InvalidKeySpecException,?InvalidKeyException,?BadPaddingException,?IllegalBlockSizeException,?UnsupportedEncodingException?{
????????byte[]?encryptDataBytes=decoder64.decode(data.getBytes(CHARSET));
????????//解密
????????Cipher?cipher?=?Cipher.getInstance("RSA/ECB/PKCS1Padding");
????????cipher.init(Cipher.DECRYPT_MODE,?getPublicKey(publicInfoStr));
????????return?new?String(cipher.doFinal(encryptDataBytes),?CHARSET);
????}
????private?static?PublicKey?getPublicKey(String?base64PublicKey)?throws?NoSuchAlgorithmException,?InvalidKeySpecException?{
????????X509EncodedKeySpec?keySpec?=?new?X509EncodedKeySpec(Base64.getDecoder().decode(base64PublicKey.getBytes()));
????????KeyFactory?keyFactory?=?KeyFactory.getInstance("RSA");
????????return?keyFactory.generatePublic(keySpec);
????}
????private?static?PrivateKey?getPrivateKey(String?base64PrivateKey)?throws?NoSuchAlgorithmException,?InvalidKeySpecException?{
????????PrivateKey?privateKey?=?null;
????????PKCS8EncodedKeySpec?keySpec?=?new?PKCS8EncodedKeySpec(Base64.getDecoder().decode(base64PrivateKey.getBytes()));
????????KeyFactory?keyFactory?=?null;
????????keyFactory?=?KeyFactory.getInstance("RSA");
????????privateKey?=?keyFactory.generatePrivate(keySpec);
????????return?privateKey;
????}
?
????/**
?????*?密鑰實體
?????*?@author?hank
?????*?@since?2020/2/28?0028?下午?16:27
?????*/
????public?static?class?SecretKey?{
????????/**
?????????*?公鑰
?????????*/
????????private?String?publicKey;
????????/**
?????????*?私鑰
?????????*/
????????private?String?privateKey;
?
????????public?SecretKey(String?publicKey,?String?privateKey)?{
????????????this.publicKey?=?publicKey;
????????????this.privateKey?=?privateKey;
????????}
?
????????public?String?getPublicKey()?{
????????????return?publicKey;
????????}
?
????????public?void?setPublicKey(String?publicKey)?{
????????????this.publicKey?=?publicKey;
????????}
?
????????public?String?getPrivateKey()?{
????????????return?privateKey;
????????}
?
????????public?void?setPrivateKey(String?privateKey)?{
????????????this.privateKey?=?privateKey;
????????}
?
????????@Override
????????public?String?toString()?{
????????????return?"SecretKey{"?+
????????????????????"publicKey='"?+?publicKey?+?'\''?+
????????????????????",?privateKey='"?+?privateKey?+?'\''?+
????????????????????'}';
????????}
????}
?
????private?static?void?writeToFile(String?path,?byte[]?key)?throws?IOException?{
????????File?f?=?new?File(path);
????????f.getParentFile().mkdirs();
?
????????try(FileOutputStream?fos?=?new?FileOutputStream(f))?{
????????????fos.write(key);
????????????fos.flush();
????????}
????}
?
????public?static?void?main(String[]?args)?throws?NoSuchAlgorithmException,?NoSuchPaddingException,?IOException,?BadPaddingException,?IllegalBlockSizeException,?InvalidKeyException,?InvalidKeySpecException?{
????????SecretKey?secretKey?=?generateSecretKey(2048);
????????System.out.println(secretKey);
????????String?enStr?=?encryptData("你好測試測試",?secretKey.getPrivateKey());
????????System.out.println(enStr);
????????String?deStr?=?decryptData(enStr,?secretKey.getPublicKey());
????????System.out.println(deStr);
????????enStr?=?encryptData("你好測試測試hello",?secretKey.getPrivateKey());
????????System.out.println(enStr);
????????deStr?=?decryptData(enStr,?secretKey.getPublicKey());
????????System.out.println(deStr);
????}
?
}以上就是小編今天的分享了,希望可以幫助到大家。
