@Slf4j public class RSAUtil { private static String publicKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ6AEtEdfDt9/2CnHc8JZsnMUBM2rkuNpA0jV++1A8bZgfXliS4HK2hJbeWWH1CW3xMnQQqq57/Nuqdt7swNiSgToSCz9SX+S2Lsj6eRPXH33l+MBjvTRRSJDRx1ydHTS5219YoDVDqJLAD7kjB2d4mM1cHZnhhfa+SXGPPkoscwIDAQAB=="; private static String privateKey="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAInoAS0R18O33/YKcdzwlmycxQEzauS42kDSNX77UDxtmB9eWJLgcraElt5ZYfUJbfEydBCqrnv826p23uzA2JKBOhILP1Jf5LYuyPp5E9cffeX4wGO9NFFIkNHHXJ0dNLnbX1igNUOoksAPuSMHZ3iYzVwdmeGF9r5JcY8+SixzAgMBAAECgYBsq3i5xjSrEqsWG9brzl4KymJndtgF0jCSIdNr86efZpEYLuVHIDzk3IhyQCbzy3FqPmK9e3IxW+jRZAh4seI2KVG+0SuJHe0ecb0v+rHIdJ9WLB03v4z7A1sV8d2GaBZKVYFm8zQJYDyEq9axfy9xfXE1gujGcgek8F4Hx3r2IQJBAOjMdFZUy7gm9UT1SCxCxbgmACJrpB3YLiXKa4DEtPOW1+K/GooZEVXqTgeJwiHJN15W4MBTbSQBivCo3domaOMCQQCXpn+JxIdAtN+g2uuepRUy5e4PEC/7QtfhWwRiDGmYOKQ9x2gJDuJE6FF4zwzf4hMaYH9RzZQmFdz1jsIrH9MxAkBeL5IF96qwZ7ql2qMHnUBHX8CALJKqrHMHQR07bNpVDztq9qxzIO89ll1ZeWe8qZ8oIPgvd9FZVvJyqa+QeifHAkBDMWSlOEztYLcNYLKxkle4O6SlS/jWjaF1moxwnStUZRRwwx/Xk56yBXXD34nG0TbBoywGpN4Vme5TZzOlQ+6hAkA6opW0LgpHjgyIf/VoUVJrdv2XXTtIuVYp2V27mFj5yl81t+keo3IiUYcTvgnQfKpxKsthSf2BMCrStLr0dmKv=="; /** * 加密 * * @param message 需要加密的字符串 * @param publicKey 公钥 * @return 加密后的字符串 */ public static String encrypt(final String message, final String publicKey) { //base64编码的公钥 try { final byte[] decoded = Base64.decodeBase64(publicKey); final RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); //RSA加密 final Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); final byte[] bytes = message.getBytes(StandardCharsets.UTF_8); //字符串长度 final int len = bytes.length; int offset = 0;//偏移量 int i = 0;//所分的段数 final ByteArrayOutputStream bos = new ByteArrayOutputStream(); while (len > offset) { byte[] cache; if (len - offset > 117) { cache = cipher.doFinal(bytes, offset, 117); } else { cache = cipher.doFinal(bytes, offset, len - offset); } bos.write(cache); i++; offset = 117 * i; } bos.close(); final String encryptMessage = Base64.encodeBase64String(bos.toByteArray()); return encryptMessage.replaceAll("[\r\n]", ""); } catch (Exception e) { //log.error("使用公钥对数据加密异常", e); } return null; } /** * 解密 * * @param message 需要解密的密文 * @param privateKey 私钥 * @return 解密后的字符串 */ public static String decrypt(String message, final String privateKey) { try { //log.info("message1 = " + message); if (message.contains(" ")) { //log.info("解码前的字符串包含空格"); message = message.replaceAll(" ", "+"); } //log.info("message2 = " + message); //base64编码的私钥 final byte[] decoded = Base64.decodeBase64(privateKey); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, priKey); //64位解码加密后的字符串 final byte[] inputByte = Base64.decodeBase64(message.getBytes(StandardCharsets.UTF_8)); final int len = inputByte.length;//密文 int offset = 0;//偏移量 int i = 0;//段数 final ByteArrayOutputStream bos = new ByteArrayOutputStream(); while (len - offset > 0) { byte[] cache; if (len - offset > 128) { cache = cipher.doFinal(inputByte, offset, 128); } else { cache = cipher.doFinal(inputByte, offset, len - offset); } bos.write(cache); i++; offset = 128 * i; } bos.close(); return new String(bos.toByteArray(), StandardCharsets.UTF_8); } catch (Exception e) { //log.error("使用私钥对数据解密异常", e); } return null; } public static void main(String[] args) { String content = "1000008"; String encryptContent = encrypt(content, publicKey); System.out.println("加密后的字符串:\n" + encryptContent); assert encryptContent != null; String decryptContent = decrypt(encryptContent, privateKey); System.out.println("解密后的字符串:\n" + decryptContent); } }
生成密钥
/** * 随机生成密钥对,返回公钥、私钥 * * @author changzhichen * @date 2020-12-16 09:11 * @return java.util.Map<java.lang.String,java.lang.Object> **/ public static Map<String, Object> genKeyPair() { try { final Map<String, Object> keyMap = new HashMap<>(); // 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.encodeBase64(publicKey.getEncoded())); // 得到私钥字符串 String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded()))); // 将公钥和私钥保存到Map //0表示公钥 keyMap.put("publicKey", publicKeyString); //1表示私钥 keyMap.put("privateKey", privateKeyString); // log.info("-----publicKey = " + publicKeyString); //log.info("-----privateKey = " + privateKeyString); System.out.printf("-----publicKey = " + publicKeyString); System.out.printf("-----privateKey = " + privateKeyString); return keyMap; } catch (NoSuchAlgorithmException e) { /// log.error("生成RSA密钥对异常", e); } return null; }