JAVA——RSA加密与解密
基本概念
Base64:Base64是網絡上最常見的用于傳輸8Bit字節碼的編碼方式之一,Base64就是一種基于64個可打印字符來表示二進制數據的方法。?
RSA:?RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。
JAVA API?
- public class Base64
extends Object 該類僅由用于獲得Base64編碼方案的編碼器和解碼器的靜態方法組成。 該類的實現支持以下類型的Base64,如RFC 4648和RFC 2045中所述 。
- Basic
使用RFC 4648和RFC 2045表1中規定的“Base64字母表”進行編碼和解碼操作。 編碼器不添加任何換行符(行分隔符)字符。 解碼器拒絕包含base64字母外的字符的數據。
- URL and Filename safe
使用RFC 4648的表2中規定的“URL和Filename safe Base64 Alphabet”進行編碼和解碼。 編碼器不添加任何換行符(行分隔符)字符。 解碼器拒絕包含base64字母外的字符的數據。
- MIME
使用RFC 2045表1中規定的“Base64字母表”進行編碼和解碼操作。 編碼輸出必須以不超過76個字符的行'\n' ,并使用回車'\r'然后立即以換行'\n'作為行分隔符。 沒有行分隔符添加到編碼輸出的末尾。 在解碼操作中,將忽略base64字母表中未找到的所有行分隔符或其他字符。
除非另有說明,否則將null參數傳遞給null的方法將導致拋出NullPointerException 。
- Basic
?
源代碼
import javax.crypto.Cipher; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.HashMap; import java.util.Map;public class RSADemo {private static Map<Integer, String> keyMap = new HashMap<Integer, String>(); //用于封裝隨機產生的公鑰與私鑰public static void main(String[] args) throws Exception {//生成公鑰和私鑰genKeyPair();//加密字符串String message = "df723820";System.out.println("隨機生成的公鑰為:" + keyMap.get(0));System.out.println("隨機生成的私鑰為:" + keyMap.get(1));String messageEn = encrypt(message,keyMap.get(0));System.out.println(message + "\t加密后的字符串為:" + messageEn);String messageDe = decrypt(messageEn,keyMap.get(1));System.out.println("還原后的字符串為:" + messageDe);}/** * 隨機生成密鑰對 * @throws NoSuchAlgorithmException */ public static void genKeyPair() throws NoSuchAlgorithmException { // KeyPairGenerator類用于生成公鑰和私鑰對,基于RSA算法生成對象 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); // 初始化密鑰對生成器,密鑰大小為96-1024位 keyPairGen.initialize(1024,new SecureRandom()); // 生成一個密鑰對,保存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私鑰 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公鑰 String publicKeyString = new String(Base64.getEncoder().encode(publicKey.getEncoded())); // 得到私鑰字符串 String privateKeyString = new String(Base64.getEncoder().encode((privateKey.getEncoded()))); // 將公鑰和私鑰保存到MapkeyMap.put(0,publicKeyString); //0表示公鑰keyMap.put(1,privateKeyString); //1表示私鑰} /** * RSA公鑰加密 * * @param str * 加密字符串* @param publicKey * 公鑰 * @return 密文 * @throws Exception * 加密過程中的異常信息 */ public static String encrypt( String str, String publicKey ) throws Exception{//base64編碼的公鑰byte[] decoded = Base64.getDecoder().decode(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));return outStr;}/** * RSA私鑰解密* * @param str * 加密字符串* @param privateKey * 私鑰 * @return 銘文* @throws Exception * 解密過程中的異常信息 */ public static String decrypt(String str, String privateKey) throws Exception{//64位解碼加密后的字符串byte[] inputByte = Base64.getDecoder().decode(str.getBytes("UTF-8"));//base64編碼的私鑰byte[] decoded = Base64.getDecoder().decode(privateKey); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); //RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;}}運行結果
隨機生成的公鑰為:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdN5gV59ncjUISnxPW0vuTiPeGJfwA5Sqnn6bTPYdHNwenUxYBB1ZU46z8pRJQZESMoBS9w5Yqu7LyPLtFhI58bq3EdrjY51gWnrxy6iZR0NlhRtgy2mLxFPpdnEiNnMoNGFwgoxdpdgIQGFwZNcA3WNIhlCFzHWvEBBQW7tRbWwIDAQAB 隨機生成的私鑰為:MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ03mBXn2dyNQhKfE9bS+5OI94Yl/ADlKqefptM9h0c3B6dTFgEHVlTjrPylElBkRIygFL3Dliq7svI8u0WEjnxurcR2uNjnWBaevHLqJlHQ2WFG2DLaYvEU+l2cSI2cyg0YXCCjF2l2AhAYXBk1wDdY0iGUIXMda8QEFBbu1FtbAgMBAAECgYAFkpnmdOBpC+zCojbez32xXhKAA8qp8XWQmX0dUboA0TeJO8203aC2w5c3IVbD2LoBTg9OJqek/iA6q+JrdWZjfoLACKXwksTzENuALzeqyRtaIFITRdr+tT8/HUP6t0TFELdSixtZPY0+Z2O31gBr2tUXLYSwSRt+gk77nRJd0QJBAM3H4eenLe6ojkHzlS4Cavqr4Dq+bMXf1fT5K17IzNbDgqmSuJywmMYgbgAIvYbAW+qGWHtq+TIaTtzrwcLgsTkCQQDDlbU4yJRNQ3E9wV4m1RtRXmiCGuuqsDoQsQoR9XN+j5h8ME6FXdm8D3t0VMQTecG5ymgpXjnNzuj/Uf9tonUzAkAWW/6m3hp2kSgL8HyoKCkZna1alLBa+8xStvRIc0cWmt3KsR+QHvwqowFwzYJSbvpNzFU269Ox5vvks1U1aJa5AkEArZxwVs1FRyg8lvLUXmgAbcP9xK+czdDMWhCsvbBBKvDQDDzdFmluYw7jKSotOpRzsDXJLB9l9Bhcnnbs4ya4HQJAeUbzhT1M6MjgmBccVcdKKfDM4Z22c9aNmmZ/IH0xEkkuRGypqLJAcA8APFCyoJ/UVNTUPeXosFKd8zei+CnvFA== df723820?? ?加密后的字符串為:bZitLiAQs+l55uJw7bu/AJ/Q/RcbwmQSVuW1aKyBZzyrKSuHviXTHgDpbfA5CJe8ENXgLCtXUVz9Nh+C28j+aQlqjXPQnI0gBKWz/NMdPnA2LIlgHnWIHD8/stvkDCenZ1zNm4ZfO1rgt0FVUhc2KAbh43FKcXXxSv3EdctAHso= 還原后的字符串為:df723820?
參考文章
https://blog.csdn.net/qy20115549/article/details/83105736
https://blog.csdn.net/zoubaicai/article/details/78494369
https://blog.csdn.net/snowolf_37/article/details/83394523
https://www.cnblogs.com/alter888/p/9140732.html
總結
以上是生活随笔為你收集整理的JAVA——RSA加密与解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BIOS——PE无法识别硬盘问题问题解决
- 下一篇: Vue.js——简单计数器