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); ????} ? }
以上就是小編今天的分享了,希望可以幫助到大家。