RsaUtil.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package com.sooka.auth.util;
  2. import javax.crypto.Cipher;
  3. import java.nio.charset.StandardCharsets;
  4. import java.security.*;
  5. import java.security.interfaces.RSAPrivateKey;
  6. import java.security.interfaces.RSAPublicKey;
  7. import java.security.spec.PKCS8EncodedKeySpec;
  8. import java.security.spec.X509EncodedKeySpec;
  9. import java.util.Base64;
  10. /**
  11. * 1.后端使用RSA算法生成一套密钥
  12. * 2.前端使用接口获取后端公钥
  13. * 3.后端将公钥传给前端,私钥留在本地服务器
  14. * 4.前端使用公钥对明文加密,传输到后端
  15. * 5.后端使用私钥解密,将密文转为明文
  16. * Author 李猛
  17. */
  18. public class RsaUtil {
  19. /**
  20. * 密钥长度 于原文长度对应 以及越长速度越慢
  21. */
  22. private final static int KEY_SIZE = 512;
  23. /**
  24. * 随机生成的一套密钥对
  25. */
  26. public static SecretKeyBo genKeyPair() throws NoSuchAlgorithmException {
  27. // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
  28. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
  29. // 初始化密钥对生成器
  30. keyPairGen.initialize(KEY_SIZE, new SecureRandom());
  31. // 生成一个密钥对,保存在keyPair中
  32. KeyPair keyPair = keyPairGen.generateKeyPair();
  33. // 得到私钥
  34. RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
  35. // 得到公钥
  36. RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
  37. String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
  38. // 得到私钥字符串
  39. String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());
  40. return new SecretKeyBo()
  41. .setPrivateKey(privateKeyString)
  42. .setPublicKey(publicKeyString);
  43. }
  44. /**
  45. * RSA公钥加密
  46. *
  47. * @param str 加密字符串
  48. * @param publicKey 公钥
  49. * @return 密文
  50. * @throws Exception 加密过程中的异常信息
  51. */
  52. public static String encrypt(String str, String publicKey) throws Exception {
  53. //base64编码的公钥
  54. byte[] decoded = Base64.getDecoder().decode(publicKey);
  55. RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
  56. //RSA加密
  57. Cipher cipher = Cipher.getInstance("RSA");
  58. cipher.init(Cipher.ENCRYPT_MODE, pubKey);
  59. return Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
  60. }
  61. /**
  62. * RSA私钥解密
  63. *
  64. * @param str 加密字符串
  65. * @param privateKey 私钥
  66. * @return 明文字符串
  67. * @throws Exception 解密过程中的异常信息
  68. */
  69. public static String decrypt(String str, String privateKey) throws Exception {
  70. //64位解码加密后的字符串
  71. byte[] inputByte = Base64.getDecoder().decode(str);
  72. //base64编码的私钥
  73. byte[] decoded = Base64.getDecoder().decode(privateKey);
  74. RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
  75. //RSA解密
  76. Cipher cipher = Cipher.getInstance("RSA");
  77. cipher.init(Cipher.DECRYPT_MODE, priKey);
  78. return new String(cipher.doFinal(inputByte));
  79. }
  80. public static void main(String[] args) throws Exception {
  81. SecretKeyBo bo = RsaUtil.genKeyPair();
  82. //公钥
  83. System.out.println(bo.getPublicKey());
  84. //私钥
  85. System.out.println(bo.getPrivateKey());
  86. //加密
  87. String str1 = RsaUtil.encrypt("123",bo.getPublicKey());
  88. System.out.println(str1);
  89. //解密
  90. String str2 = RsaUtil.decrypt(str1,bo.getPrivateKey());
  91. System.out.println(str2);
  92. }
  93. }