001package top.cenze.utils.crypt; 002 003import top.cenze.utils.pojo.RsaKeyPair; 004 005import javax.crypto.Cipher; 006import java.security.*; 007import java.security.spec.PKCS8EncodedKeySpec; 008import java.security.spec.X509EncodedKeySpec; 009import java.util.Base64; 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 RsaKeyPair genKeyPair() throws NoSuchAlgorithmException { 027 //为RSA算法创建KeyPairGenerator对象 028 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_TYPE); 029 //创建RSA算法可信任的随机数源 030 SecureRandom secureRandom = new SecureRandom(); 031 //使用随机数源初始化keyPairGenerator对象 032 keyPairGenerator.initialize(KEY_LENGTH, secureRandom); 033 //生成密钥对 034 KeyPair keyPair = keyPairGenerator.genKeyPair(); 035 //获取私钥 036 PrivateKey privateKey = keyPair.getPrivate(); 037 //获取公钥 038 PublicKey publicKey = keyPair.getPublic(); 039 //使用base64将私钥和公钥转化为字符串 040 String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded()); 041 String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded()); 042 043 RsaKeyPair pair = new RsaKeyPair(); 044 pair.setPrivateKey(privateKeyStr); 045 pair.setPublicKey(publicKeyStr); 046 047 return pair; 048 } 049 050 /** 051 * 加密 052 * @param data 053 * @param publicKey 054 * @return 055 * @throws Exception 056 */ 057 public static String encrypt(String data, String publicKey) throws Exception { 058 //base64编码的公钥解析为二进制 059 byte[] publicKeyByte = Base64.getDecoder().decode(publicKey); 060 //得到公钥 061 PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyByte)); 062 //加密数据 063 Cipher cipher = Cipher.getInstance("RSA"); 064 cipher.init(Cipher.ENCRYPT_MODE, pubKey); 065 //得到加密后的数据 066 String encryptData = Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes())); 067 return encryptData; 068 } 069 070 /** 071 * 解密 072 * @param data 073 * @param privateKey 074 * @return 075 * @throws Exception 076 */ 077 public static String decrypt(String data, String privateKey) throws Exception { 078 //base64编码的私钥解析为二进制 079 byte[] privateKeyByte = Base64.getDecoder().decode(privateKey); 080 //base64解析后的加密数据 081 byte[] dataByte = Base64.getDecoder().decode(data.getBytes()); 082 //获取私钥 083 PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyByte)); 084 //RSA解密 085 Cipher cipher = Cipher.getInstance("RSA"); 086 cipher.init(Cipher.DECRYPT_MODE, priKey); 087 //得到解密后的数据 088 String decryptData = new String(cipher.doFinal(dataByte)); 089 return decryptData; 090 } 091}