package com.hzcominfo.application.resourcecenter.core.common.util; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import java.io.IOException; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; public class RSAUtil { //生成秘钥对 public static KeyPair getKeyPair() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); return keyPair; } //获取公钥(Base64编码) public static String getPublicKey(KeyPair keyPair) { PublicKey publicKey = keyPair.getPublic(); byte[] bytes = publicKey.getEncoded(); return byte2Base64(bytes); } //获取私钥(Base64编码) public static String getPrivateKey(KeyPair keyPair) { PrivateKey privateKey = keyPair.getPrivate(); byte[] bytes = privateKey.getEncoded(); return byte2Base64(bytes); } //将Base64编码后的公钥转换成PublicKey对象 public static PublicKey string2PublicKey(String pubStr) throws Exception { byte[] keyBytes = base642Byte(pubStr); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(keySpec); return publicKey; } //将Base64编码后的私钥转换成PrivateKey对象 public static PrivateKey string2PrivateKey(String priStr) throws Exception { byte[] keyBytes = base642Byte(priStr); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); return privateKey; } //公钥加密 public static byte[] publicEncrypt(byte[] content, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] bytes = cipher.doFinal(content); return bytes; } //私钥解密 public static byte[] privateDecrypt(byte[] content, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] bytes = cipher.doFinal(content); return bytes; } //字节数组转Base64编码 public static String byte2Base64(byte[] bytes) { BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(bytes); } //Base64编码转字节数组 public static byte[] base642Byte(String base64Key) throws IOException { BASE64Decoder decoder = new BASE64Decoder(); return decoder.decodeBuffer(base64Key); } //用公钥加密 public static String getPublicKey(String psd) throws Exception { //生成RSA公钥和私钥,并Base64编码 KeyPair keyPair = RSAUtil.getKeyPair(); String publicKeyStr = RSAUtil.getPublicKey(keyPair); //将Base64编码后的公钥转换成PublicKey对象 PublicKey publicKey = RSAUtil.string2PublicKey(publicKeyStr); //用公钥加密 byte[] publicEncrypt = RSAUtil.publicEncrypt(psd.getBytes(), publicKey); //加密后的内容Base64编码 String byte2Base64 = RSAUtil.byte2Base64(publicEncrypt); return byte2Base64; } //用私钥解密 public static String getPrivateKey(String byte2Base64) throws Exception { String result = ""; try { //生成RSA公钥和私钥,并Base64编码 KeyPair keyPair = RSAUtil.getKeyPair(); String privateKeyStr = RSAUtil.getPrivateKey(keyPair); //将Base64编码后的私钥转换成PrivateKey对象 PrivateKey privateKey = RSAUtil.string2PrivateKey(privateKeyStr); //加密后的内容Base64解码 byte[] base642Byte = RSAUtil.base642Byte(byte2Base64); //用私钥解密 byte[] privateDecrypt = RSAUtil.privateDecrypt(base642Byte, privateKey); //解密后的明文 result = new String(privateDecrypt); } catch (Exception e) { e.printStackTrace(); } return result; } public static void main(String[] args) { try { //===============生成公钥和私钥,公钥传给客户端,私钥服务端保留================== //生成RSA公钥和私钥,并Base64编码 KeyPair keyPair = RSAUtil.getKeyPair(); String publicKeyStr = RSAUtil.getPublicKey(keyPair); String privateKeyStr = RSAUtil.getPrivateKey(keyPair); System.out.println("RSA公钥Base64编码:" + publicKeyStr); System.out.println("RSA私钥Base64编码:" + privateKeyStr); //=================客户端================= String message = "hello, i am infi, good night!"; //将Base64编码后的公钥转换成PublicKey对象 PublicKey publicKey = RSAUtil.string2PublicKey(publicKeyStr); //用公钥加密 byte[] publicEncrypt = RSAUtil.publicEncrypt(message.getBytes(), publicKey); //加密后的内容Base64编码 String byte2Base64 = RSAUtil.byte2Base64(publicEncrypt); System.out.println("公钥加密并Base64编码的结果:" + byte2Base64); //===================服务端================ //将Base64编码后的私钥转换成PrivateKey对象 PrivateKey privateKey = RSAUtil.string2PrivateKey(privateKeyStr); //加密后的内容Base64解码 byte[] base642Byte = RSAUtil.base642Byte(byte2Base64); //用私钥解密 byte[] privateDecrypt = RSAUtil.privateDecrypt(base642Byte, privateKey); //解密后的明文 System.out.println("解密后的明文: " + new String(privateDecrypt)); } catch (Exception e) { e.printStackTrace(); } } }