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.info("需要加密的数据:{}", 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.info("Base64加密后的数据:{}", encryptedText); // encryptedText = URLEncoder.encode(encryptedText, StandardCharsets.UTF_8.toString()); // log.info("URLEncoder编码后的数据:{}", encryptedText); // String decodedString = URLDecoder.decode(encryptedText, "UTF-8"); // log.info("URLEncoder解码后的数据:{}", decodedString); // return encryptedText; // } catch (Exception e) { // log.error("加密失败了:{}", e.getMessage()); // } // return null; // } /** * 要加密的明文数据 * * @param plainText * @return */ public String encryptedData(String plainText, String pub_key) { 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/ECB/PKCS1Padding"); encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedBytes = encryptCipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); // URL Safe Base64 编码 return Base64.getUrlEncoder().encodeToString(encryptedBytes); } catch (Exception e) { log.error("加密失败: {}", e.getMessage()); } return null; } /** * 数据解密 * * @param encryptedData * @return */ public String decryptedData(String encryptedData, String pri_key) { 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); // URL Safe Base64 解码 byte[] cipherBytes = Base64.getUrlDecoder().decode(encryptedData); // 使用私钥解密数据 Cipher decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); decryptCipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedBytes = decryptCipher.doFinal(cipherBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } 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); } }