RSAUtil.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package com.qs.mp.common.utils;
  2. import com.qs.mp.common.exception.ServiceException;
  3. import java.nio.charset.StandardCharsets;
  4. import java.security.KeyFactory;
  5. import java.security.KeyPair;
  6. import java.security.KeyPairGenerator;
  7. import java.security.NoSuchAlgorithmException;
  8. import java.security.SecureRandom;
  9. import java.security.interfaces.RSAPrivateKey;
  10. import java.security.interfaces.RSAPublicKey;
  11. import java.security.spec.PKCS8EncodedKeySpec;
  12. import java.security.spec.X509EncodedKeySpec;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. import javax.crypto.Cipher;
  16. import org.apache.commons.codec.binary.Base64;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.stereotype.Component;
  19. @Component
  20. public class RSAUtil {
  21. private static String privateKey;
  22. @Value("${rsa.private-key}")
  23. public static void setPrivateKey(String priKey) {
  24. privateKey = priKey;
  25. }
  26. private static String publicKey;
  27. @Value("${rsa.public-key}")
  28. public static void setPublicKey(String pubKey) {
  29. publicKey = pubKey;
  30. }
  31. private static final Map<Integer, String> keyMap = new HashMap<Integer, String>(); //用于封装随机产生的公钥与私钥
  32. public static void main(String[] args) throws Exception {
  33. //生成公钥和私钥
  34. genKeyPair();
  35. //加密字符串
  36. String message = "5";
  37. System.out.println("随机生成的公钥为:" + keyMap.get(0));
  38. System.out.println("随机生成的私钥为:" + keyMap.get(1));
  39. // String messageEn = encrypt(message,keyMap.get(0));
  40. // System.out.println(message + "\t加密后的字符串为:" + messageEn);
  41. // String messageDe = decrypt(messageEn,keyMap.get(1));
  42. // System.out.println("还原后的字符串为:" + messageDe);
  43. }
  44. /**
  45. * 随机生成密钥对
  46. *
  47. * @throws NoSuchAlgorithmException
  48. */
  49. public static void genKeyPair() throws NoSuchAlgorithmException {
  50. // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
  51. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
  52. // 初始化密钥对生成器,密钥大小为96-1024位
  53. keyPairGen.initialize(1024, new SecureRandom());
  54. // 生成一个密钥对,保存在keyPair中
  55. KeyPair keyPair = keyPairGen.generateKeyPair();
  56. RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥
  57. RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥
  58. String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
  59. // 得到私钥字符串
  60. String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
  61. // 将公钥和私钥保存到Map
  62. keyMap.put(0, publicKeyString); //0表示公钥
  63. keyMap.put(1, privateKeyString); //1表示私钥
  64. }
  65. /**
  66. * RSA公钥加密
  67. *
  68. * @param str 加密字符串
  69. * @param publicKey 公钥
  70. * @return 密文
  71. * @throws Exception 加密过程中的异常信息
  72. */
  73. public static String encrypt(String str) {
  74. try {
  75. //base64编码的公钥
  76. byte[] decoded = Base64.decodeBase64(publicKey);
  77. RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
  78. .generatePublic(new X509EncodedKeySpec(decoded));
  79. //RSA加密
  80. Cipher cipher = Cipher.getInstance("RSA");
  81. cipher.init(Cipher.ENCRYPT_MODE, pubKey);
  82. String outStr = Base64.encodeBase64String(
  83. cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
  84. return outStr;
  85. } catch (Exception e) {
  86. throw new ServiceException("加密幸运数字异常,str:" + str, e);
  87. }
  88. }
  89. /**
  90. * RSA私钥解密
  91. *
  92. * @param str 加密字符串
  93. * @param privateKey 私钥
  94. * @return 铭文
  95. * @throws Exception 解密过程中的异常信息
  96. */
  97. public static String decrypt(String str) {
  98. try {
  99. //64位解码加密后的字符串
  100. byte[] inputByte = Base64.decodeBase64(str.getBytes(StandardCharsets.UTF_8));
  101. //base64编码的私钥
  102. byte[] decoded = Base64.decodeBase64(privateKey);
  103. RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA")
  104. .generatePrivate(new PKCS8EncodedKeySpec(decoded));
  105. //RSA解密
  106. Cipher cipher = Cipher.getInstance("RSA");
  107. cipher.init(Cipher.DECRYPT_MODE, priKey);
  108. String outStr = new String(cipher.doFinal(inputByte));
  109. return outStr;
  110. } catch (Exception e) {
  111. throw new ServiceException("解密幸运数字异常,str:" + str, e);
  112. }
  113. }
  114. }