001package top.cenze.utils.crypt; 002 003import javax.crypto.Cipher; 004import java.security.*; 005import java.security.spec.PKCS8EncodedKeySpec; 006import java.security.spec.X509EncodedKeySpec; 007import java.util.Base64; 008import java.util.HashMap; 009import java.util.Map; 010 011/** 012 * RSA对称加密工具 013 * (公钥加密,私钥解密) 014 * @author chengze 015 * @date 2023-11-14 22:05 016 */ 017public class RSAUtil { 018 public static int KEY_LENGTH = 1024;//密钥大小 019 public static String ALGORITHM_TYPE = "RSA";//算法类型 020 021 /** 022 * 生成密钥 023 * @return privateKey、publicKey 024 * @throws NoSuchAlgorithmException 025 */ 026 public static Map genKeyPair() throws NoSuchAlgorithmException { 027 Map<String, String> keyMap = new HashMap<String, String>();//存储公钥和私钥 028 //为RSA算法创建KeyPairGenerator对象 029 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_TYPE); 030 //创建RSA算法可信任的随机数源 031 SecureRandom secureRandom = new SecureRandom(); 032 //使用随机数源初始化keyPairGenerator对象 033 keyPairGenerator.initialize(KEY_LENGTH, secureRandom); 034 //生成密钥对 035 KeyPair keyPair = keyPairGenerator.genKeyPair(); 036 //获取私钥 037 PrivateKey privateKey = keyPair.getPrivate(); 038 //获取公钥 039 PublicKey publicKey = keyPair.getPublic(); 040 //使用base64将私钥和公钥转化为字符串 041 String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded()); 042 String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded()); 043 keyMap.put("privateKey", privateKeyStr); 044 keyMap.put("publicKey", publicKeyStr); 045 046 return keyMap; 047 } 048 049 /** 050 * 加密 051 * @param data 052 * @param publicKey 053 * @return 054 * @throws Exception 055 */ 056 public static String encrypt(String data, String publicKey) throws Exception { 057 //base64编码的公钥解析为二进制 058 byte[] publicKeyByte = Base64.getDecoder().decode(publicKey); 059 //得到公钥 060 PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyByte)); 061 //加密数据 062 Cipher cipher = Cipher.getInstance("RSA"); 063 cipher.init(Cipher.ENCRYPT_MODE, pubKey); 064 //得到加密后的数据 065 String encryptData = Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes())); 066 return encryptData; 067 } 068 069 /** 070 * 解密 071 * @param data 072 * @param privateKey 073 * @return 074 * @throws Exception 075 */ 076 public static String decrypt(String data, String privateKey) throws Exception { 077 //base64编码的私钥解析为二进制 078 byte[] privateKeyByte = Base64.getDecoder().decode(privateKey); 079 //base64解析后的加密数据 080 byte[] dataByte = Base64.getDecoder().decode(data.getBytes()); 081 //获取私钥 082 PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyByte)); 083 //RSA解密 084 Cipher cipher = Cipher.getInstance("RSA"); 085 cipher.init(Cipher.DECRYPT_MODE, priKey); 086 //得到解密后的数据 087 String decryptData = new String(cipher.doFinal(dataByte)); 088 return decryptData; 089 } 090}