package com.ruoyi.common.utils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.crypto.Cipher; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; @Slf4j @Component public class RSAPublicKeyExample { /** * 数据解密 * * @param encryptedData * @return */ public String decryptedData(String encryptedData, String pri_key) { String privateKeyString = "私钥的Base64编码字符串"; // 后端私钥的Base64编码字符串 try { // 将私钥Base64编码字符串转换为PrivateKey对象 byte[] privateKeyBytes = Base64.getDecoder().decode(pri_key); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); // 使用私钥解密数据 Cipher decryptCipher = Cipher.getInstance("RSA"); decryptCipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedBytes = decryptCipher.doFinal(Base64.getDecoder().decode(encryptedData)); // 解密后的数据 String decryptedData = new String(decryptedBytes); System.out.println("解密后的数据:" + decryptedData); return decryptedData; } catch (Exception e) { log.error("解密报错了:{}", e.getMessage()); } return null; } /** * 要加密的明文数据 * * @param plainText * @return */ public String encryptedData(String plainText, String pub_key) { log.error("需要加密的数据:{}", plainText); try { byte[] publicKeyBytes = Base64.getDecoder().decode(pub_key); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(keySpec); // 使用公钥加密数据 Cipher encryptCipher = Cipher.getInstance("RSA"); encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedBytes = encryptCipher.doFinal(plainText.getBytes()); // 将加密后的数据转换为Base64编码的字符串 String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes); log.error("Base64加密后的数据:{}", encryptedText); encryptedText = URLEncoder.encode(encryptedText, StandardCharsets.UTF_8.toString()); log.error("URLEncoder编码后的数据:{}", encryptedText); String decodedString = URLDecoder.decode(encryptedText, "UTF-8"); log.error("URLEncoder解码后的数据:{}", decodedString); return encryptedText; } catch (Exception e) { log.error("加密失败了:{}", e.getMessage()); } return null; } public static void main(String[] args) { String decodedString = null; try { decodedString = URLDecoder.decode("0902%E4%BB%BB%E5%8A%A1%E6%B5%8B%E8%AF%95--------", "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(decodedString); } }