生成公钥和私钥
import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.io.IOException; import java.math.BigInteger; import java.security.*; import java.security.spec.*; /** * RSA生成公钥、私钥工具类 / public class RSAUtil { /** * 生成秘钥对 * * @return * @throws Exception */ public static KeyPair getKeyPair() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); return keyPair; } /** * 获取公钥(Base64编码) * * @param keyPair * @return */ public static String getPublicKey(KeyPair keyPair) { PublicKey publicKey = keyPair.getPublic(); byte[] bytes = publicKey.getEncoded(); return byte2Base64(bytes); } /** * 获取私钥(Base64编码) * * @param keyPair * @return */ public static String getPrivateKey(KeyPair keyPair) { PrivateKey privateKey = keyPair.getPrivate(); byte[] bytes = privateKey.getEncoded(); return byte2Base64(bytes); } /** * 将Base64编码后的公钥转换成PublicKey对象 * * @param pubStr * @return * @throws Exception */ 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对象 * * @param priStr * @return * @throws Exception */ 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; } /** * 公钥加密 * * @param content * @param publicKey * @return * @throws Exception */ 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; } /** * 私钥解密 * * @param content * @param privateKey * @return * @throws Exception */ 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编码 * * @param bytes * @return */ public static String byte2Base64(byte[] bytes) { return Base64.encodeBase64String(bytes); } /** * Base64编码转字节数组 * * @param base64Key * @return * @throws IOException */ public static byte[] base642Byte(String base64Key) throws IOException { return Base64.decodeBase64(base64Key); } /** * 通过私钥获取公钥 * * @param privateKey * @return */ public static String getPublicKeyByPrivateKey(String privateKey) { try { KeyFactory kf = KeyFactory.getInstance("RSA"); RSAPrivateKeySpec priv = kf.getKeySpec(string2PrivateKey(privateKey), RSAPrivateKeySpec.class); RSAPublicKeySpec keySpec = new RSAPublicKeySpec(priv.getModulus(), BigInteger.valueOf(65537)); PublicKey publicKey = kf.generatePublic(keySpec); byte[] bytes = publicKey.getEncoded(); return byte2Base64(bytes); } catch (InvalidKeySpecException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return ""; } public static void main(String[] orgs) { 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 publicKeyByPrivateKey = getPublicKeyByPrivateKey(privateKeyStr); System.out.println("publicKeyByPrivateKey:" + publicKeyByPrivateKey); } catch (Exception e) { e.printStackTrace(); } }
人这辈子没法做太多事情,所以每做一件事都要做到精彩绝伦。
因为,这就是我的宿命。人生苦短,你明白吗?
所以这是我为人生做出的选择