• java rsa 加解密 验证


    1. package com.chainlan.common.utils;
    2. import java.io.IOException;
    3. import java.security.*;
    4. import java.security.spec.PKCS8EncodedKeySpec;
    5. import java.security.spec.X509EncodedKeySpec;
    6. import java.util.HashMap;
    7. import javax.crypto.Cipher;
    8. import com.alibaba.fastjson2.JSON;
    9. import org.apache.commons.codec.binary.Base64;
    10. import sun.misc.BASE64Decoder;
    11. import sun.misc.BASE64Encoder;
    12. public class RsaUtils {
    13. public static final String PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh9WDjajsQtp1VHM9cIt176fsAY/EzPiqC1eEAOiBXiaBHNKHRFABI4tqxtG8z4YRF8d1Is/8AJeFhKW7v37PEJl2jjPVb68w9ly3juDDdzEXzXPgB8l3CTrplkmMbXoSzzH3GP6+4S4sk0JGcvTHO6AdC1l7UArCBUP32mN7GaqSMw5r98umvJt8URvJKBGoUSk0AsW75nvP9s3S8NpLfqYwXKC/lCjDrocfg2+ZnFIoDrc5glwYLVB5Cw9d861cNY8ikupVYVlC1g1IRIy8jDsrupAscf86uVyhL2YB3lkIenlMjRvHdDIxsppWAy9IFX5b/yEsC41ZBZaSImcSeQIDAQAB";
    14. public static final String PRIVATE_KEY = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCH1YONqOxC2nVUcz1wi3Xvp+wBj8TM+KoLV4QA6IFeJoEc0odEUAEji2rG0bzPhhEXx3Uiz/wAl4WEpbu/fs8QmXaOM9VvrzD2XLeO4MN3MRfNc+AHyXcJOumWSYxtehLPMfcY/r7hLiyTQkZy9Mc7oB0LWXtQCsIFQ/faY3sZqpIzDmv3y6a8m3xRG8koEahRKTQCxbvme8/2zdLw2kt+pjBcoL+UKMOuhx+Db5mcUigOtzmCXBgtUHkLD13zrVw1jyKS6lVhWULWDUhEjLyMOyu6kCxx/zq5XKEvZgHeWQh6eUyNG8d0MjGymlYDL0gVflv/ISwLjVkFlpIiZxJ5AgMBAAECggEARO1r3C6j9Si18SypOLsMFZi4gfJag0iLwUWfjnZtb0FKsz2BtoCCk27juBAmJ4h4lAB6yDeSQRqifjU7mGjY2iuFpZNX81yLE/jojHAxwAIBehgaztjEtsJWVhTsVYFkmg9YvC5I3it4IyG2bg8YKoGNO30kvfE3k0RyOTfR96uBS87L98OFDL85ZNofmDyr36a1/HsXBmvnztTU8QIdRLvQLjp5kCLiycOjjEBbQ4zbQMwqyZvsiFaKEha5XpKve1e6I+/w/56eOUvd+R7Ozzr5CBDvQhzVl8qppAtqgSx6D5ldzAFXau4qNDXN7WYC/m3tlKwlOJi2iE67HtsygQKBgQC941xHO5Uxh0UTLWp2tubi8aZ2ZJ8YUf+wWKVxzkxXr4dF1mmCngwFkVAVwUyRN27eNDI8NJv2/uDTgWGPjIRrKG7axwuARiOzMzSQ7PfFj/UiX3uEWRtGLtIYgfwlk4RdwYOgt3KwBSGGn3P6noFQgyP3cg1Mq2SpcxMIJDmPlQKBgQC3IFaCiXjuJ7HgJdIsTdjlTSOdBA/zEmY2sLhUxgCxzRSISKyOG4U56+YzU9+acEedv12sCAxx8f/qsMcm21XpfePy2GrVeqpmf9n0FgVapEIIGcmnZXfRZ0CP1LneKoHvqff4R3joSkHVXSwhHHlfTf0v4LGiIDCyxEs51J9OVQKBgDA2ijeL6VWqAt/bqCx8RCNbN+jXo42JRGKCH3/F4Zxh9PbGegOwHV1MiAj+C3LToFLK7fZbZT5ReMQ7FYpdI0ISAhOKdmEbbfUSC0bA5ChFZPhVRgdUmJg5Sx7t4heoXPNxLvqfmX8XzmtgERKRLERFB9zMGJRe8DAWB78Jc5QBAoGABV1tK2XbpR6El4yEG8gsEouv/2mfDf/7/p4uyE0EuDDJ6TQ32fH0dT30AIz0gBHKB1UT6XZS5wOv+7AyJXFHkw+dHgA5IQf29gnI2N3MSluFk7ctsTnHyNq9iXkx+NBF/j98hEmTwTprs1SHdnDfHWurfzuV+Kn4w0P88DTKdgECgYBR75Juwn5MCfJBtaygs2VemvAxn7xtckerzhgokrPnPG1Fn+YIPK7p/6HkEtaT4vxAP55cdCrd1QA2wwjZGNY+bppZ6kOghnNG6ttz7Y88n/o4saELt/W9+BxzFuUQhVXnjOnGUkbGwqsdAoAZmGkFN0h1BPsrkSdm9ZsJqZ+Gow==";
    15. /**
    16. * 生成秘钥对
    17. * @return
    18. * @throws Exception
    19. */
    20. public static KeyPair getKeyPair() throws Exception {
    21. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    22. keyPairGenerator.initialize(2048);
    23. KeyPair keyPair = keyPairGenerator.generateKeyPair();
    24. return keyPair;
    25. }
    26. /**
    27. * 获取公钥(Base64编码)
    28. * @param keyPair
    29. * @return
    30. */
    31. public static String getPublicKey(KeyPair keyPair){
    32. PublicKey publicKey = keyPair.getPublic();
    33. byte[] bytes = publicKey.getEncoded();
    34. return byte2Base64(bytes);
    35. }
    36. /**
    37. * 获取私钥(Base64编码)
    38. * @param keyPair
    39. * @return
    40. */
    41. public static String getPrivateKey(KeyPair keyPair){
    42. PrivateKey privateKey = keyPair.getPrivate();
    43. byte[] bytes = privateKey.getEncoded();
    44. return byte2Base64(bytes);
    45. }
    46. /**
    47. * 将Base64编码后的公钥转换成PublicKey对象
    48. * @param pubStr
    49. * @return
    50. * @throws Exception
    51. */
    52. public static PublicKey string2PublicKey(String pubStr) throws Exception{
    53. byte[] keyBytes = base642Byte(pubStr);
    54. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
    55. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    56. PublicKey publicKey = keyFactory.generatePublic(keySpec);
    57. return publicKey;
    58. }
    59. /**
    60. * 将Base64编码后的私钥转换成PrivateKey对象
    61. * @param priStr
    62. * @return
    63. * @throws Exception
    64. */
    65. public static PrivateKey string2PrivateKey(String priStr) throws Exception{
    66. byte[] keyBytes = base642Byte(priStr);
    67. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
    68. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    69. PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
    70. return privateKey;
    71. }
    72. /**
    73. * 公钥加密
    74. * @param content
    75. * @param publicKey
    76. * @return
    77. * @throws Exception
    78. */
    79. public static String publicEncrypt(HashMap<Object,Object> content, PublicKey publicKey) throws Exception{
    80. String s=hashMapToString(content);
    81. byte[] b=stringTobyte(hashMapToString(content));
    82. Cipher cipher = Cipher.getInstance("RSA");
    83. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    84. byte[] bytes = cipher.doFinal(b);
    85. return byte2Base64(bytes);
    86. }
    87. /**
    88. * 签名
    89. * @param data
    90. * @param privateKey
    91. * @return
    92. * @throws Exception
    93. */
    94. public static String sign(String data, PrivateKey privateKey) throws Exception {
    95. byte[] keyBytes = privateKey.getEncoded();
    96. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
    97. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    98. PrivateKey key = keyFactory.generatePrivate(keySpec);
    99. Signature signature = Signature.getInstance("MD5withRSA");
    100. signature.initSign(key);
    101. signature.update(data.getBytes("utf-8"));
    102. return new String(Base64.encodeBase64(signature.sign()),"utf-8");
    103. }
    104. /**
    105. * 验签
    106. * @param srcData
    107. * @param publicKey
    108. * @param sign
    109. * @return
    110. * @throws Exception
    111. */
    112. public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {
    113. byte[] keyBytes = publicKey.getEncoded();
    114. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
    115. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    116. PublicKey key = keyFactory.generatePublic(keySpec);
    117. Signature signature = Signature.getInstance("MD5withRSA");
    118. signature.initVerify(key);
    119. signature.update(srcData.getBytes("utf-8"));
    120. return signature.verify(Base64.decodeBase64(sign.getBytes("utf-8")));
    121. }
    122. /**
    123. * 解密
    124. * @param content
    125. * @param privateKey
    126. * @return
    127. * @throws Exception
    128. */
    129. public static HashMap<Object,Object> privateDecrypt(String content, PrivateKey privateKey) throws Exception{
    130. byte[] b=base642Byte(content);
    131. Cipher cipher = Cipher.getInstance("RSA");
    132. cipher.init(Cipher.DECRYPT_MODE, privateKey);
    133. byte[] bytes = cipher.doFinal(b);
    134. return stringToHashMap(byteToSting(bytes));
    135. }
    136. /**
    137. * 字节数组转Base64编码
    138. * @param bytes
    139. * @return
    140. */
    141. public static String byte2Base64(byte[] bytes){
    142. BASE64Encoder encoder = new BASE64Encoder();
    143. return encoder.encode(bytes);
    144. }
    145. /**
    146. * Base64编码转字节数组
    147. * @param base64Key
    148. * @return
    149. * @throws IOException
    150. */
    151. public static byte[] base642Byte(String base64Key) throws IOException{
    152. BASE64Decoder decoder = new BASE64Decoder();
    153. return decoder.decodeBuffer(base64Key);
    154. }
    155. /**
    156. * hashMap 转 string
    157. * @param hm
    158. * @return
    159. */
    160. public static String hashMapToString(HashMap<Object,Object> hm){
    161. return JSON.toJSONString(hm);
    162. }
    163. /**
    164. * string 转 hashMap
    165. * @param s
    166. * @return
    167. */
    168. public static HashMap<Object,Object> stringToHashMap(String s){
    169. HashMap<Object ,Object> m = JSON.parseObject(s, HashMap.class);
    170. return m;
    171. }
    172. /**
    173. * byte[] 转 string
    174. * @param b
    175. * @return
    176. */
    177. public static String byteToSting(byte[] b){
    178. return new String(b);
    179. }
    180. /**
    181. * string 转 byte[]
    182. * @param s
    183. * @return
    184. */
    185. public static byte[] stringTobyte(String s){
    186. byte[] bytes = s.getBytes();
    187. return bytes;
    188. }
    189. /**
    190. * 分割字符串
    191. * @param s
    192. * @return
    193. */
    194. public static String[] split(String s){
    195. return s.split(".");
    196. }
    197. /**
    198. * 获取密钥对
    199. */
    200. public static void getKey(){
    201. try {
    202. KeyPair key = getKeyPair();
    203. String puk=RsaUtils.getPublicKey(key);
    204. System.out.println(puk);
    205. String pvk=RsaUtils.getPrivateKey(key);
    206. System.out.println(pvk);
    207. } catch (Exception e) {
    208. e.printStackTrace();
    209. }
    210. }
    211. }

     

    KeyPair key=RsaUtils.getKeyPair();

    PublicKey puk=RsaUtils.string2PublicKey(RsaUtils.PUBLIC_KEY);

    PrivateKey prk=RsaUtils.string2PrivateKey(RsaUtils.PRIVATE_KEY);

    HashMap h=new HashMap<>();

    h.put("nickname","小王");

    String result=RsaUtils.publicEncrypt(h,puk);

    HashMap jmresult=RsaUtils.privateDecrypt(result,prk);

    System.out.println(jmresult);

    //签名

    String sign=RsaUtils.sign(RsaUtils.hashMapToString(h),prk);

    boolean re=RsaUtils.verify(RsaUtils.hashMapToString(h),puk,sign);

    if(re){

            System.out.println("验签成功");

    }else{

            System.out.println("验签失败");

    }

  • 相关阅读:
    详解位段+枚举+联合(接结构体)
    基于go-micro微服务的实战-注册成功推送Rabbitmq队列,邮件服务异步发送邮件(七)
    条件生成对抗网络(cGAN)在AI去衣技术中的应用探索
    Python(黄金时代)—— 搞定python的日志
    Spring整合JUnit
    【推导】线性变换与在基下的矩阵一一对应
    通过媒体查询来实现 WPF 响应式设计
    关于iNand的分区(fdisk命令的源码分析)
    Qt5.9.8在linux银河麒麟下关闭系统带的最大化最小化和关闭按键
    kafka(四)消息类型
  • 原文地址:https://blog.csdn.net/zhang804633234/article/details/127703476