123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- package com.sooka.auth.util;
- import javax.crypto.Cipher;
- import java.nio.charset.StandardCharsets;
- import java.security.*;
- import java.security.interfaces.RSAPrivateKey;
- import java.security.interfaces.RSAPublicKey;
- import java.security.spec.PKCS8EncodedKeySpec;
- import java.security.spec.X509EncodedKeySpec;
- import java.util.Base64;
- /**
- * 1.后端使用RSA算法生成一套密钥
- * 2.前端使用接口获取后端公钥
- * 3.后端将公钥传给前端,私钥留在本地服务器
- * 4.前端使用公钥对明文加密,传输到后端
- * 5.后端使用私钥解密,将密文转为明文
- * Author 李猛
- */
- public class RsaUtil {
- /**
- * 密钥长度 于原文长度对应 以及越长速度越慢
- */
- private final static int KEY_SIZE = 512;
- /**
- * 随机生成的一套密钥对
- */
- public static SecretKeyBo genKeyPair() throws NoSuchAlgorithmException {
- // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
- KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
- // 初始化密钥对生成器
- keyPairGen.initialize(KEY_SIZE, new SecureRandom());
- // 生成一个密钥对,保存在keyPair中
- KeyPair keyPair = keyPairGen.generateKeyPair();
- // 得到私钥
- RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
- // 得到公钥
- RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
- String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
- // 得到私钥字符串
- String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());
- return new SecretKeyBo()
- .setPrivateKey(privateKeyString)
- .setPublicKey(publicKeyString);
- }
- /**
- * RSA公钥加密
- *
- * @param str 加密字符串
- * @param publicKey 公钥
- * @return 密文
- * @throws Exception 加密过程中的异常信息
- */
- public static String encrypt(String str, String publicKey) throws Exception {
- //base64编码的公钥
- byte[] decoded = Base64.getDecoder().decode(publicKey);
- RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
- //RSA加密
- Cipher cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.ENCRYPT_MODE, pubKey);
- return Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
- }
- /**
- * RSA私钥解密
- *
- * @param str 加密字符串
- * @param privateKey 私钥
- * @return 明文字符串
- * @throws Exception 解密过程中的异常信息
- */
- public static String decrypt(String str, String privateKey) throws Exception {
- //64位解码加密后的字符串
- byte[] inputByte = Base64.getDecoder().decode(str);
- //base64编码的私钥
- byte[] decoded = Base64.getDecoder().decode(privateKey);
- RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
- //RSA解密
- Cipher cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.DECRYPT_MODE, priKey);
- return new String(cipher.doFinal(inputByte));
- }
- public static void main(String[] args) throws Exception {
- SecretKeyBo bo = RsaUtil.genKeyPair();
- //公钥
- System.out.println(bo.getPublicKey());
- //私钥
- System.out.println(bo.getPrivateKey());
- //加密
- String str1 = RsaUtil.encrypt("123",bo.getPublicKey());
- System.out.println(str1);
- //解密
- String str2 = RsaUtil.decrypt(str1,bo.getPrivateKey());
- System.out.println(str2);
- }
- }
|