zoukankan      html  css  js  c++  java
  • 单例模式RSA工具类

    单例模式RSA工具类

      1 package com.founder.centerbusiness.common.utils;
      2 
      3 import org.apache.commons.codec.binary.Base64;
      4 import javax.crypto.Cipher;
      5 import java.security.KeyFactory;
      6 import java.security.KeyPair;
      7 import java.security.KeyPairGenerator;
      8 import java.security.NoSuchAlgorithmException;
      9 import java.security.SecureRandom;
     10 import java.security.interfaces.RSAPrivateKey;
     11 import java.security.interfaces.RSAPublicKey;
     12 import java.security.spec.PKCS8EncodedKeySpec;
     13 import java.security.spec.X509EncodedKeySpec;
     14 import java.util.HashMap;
     15 import java.util.Map;
     16 import java.util.concurrent.locks.ReentrantLock;
     17 
     18 //Author:guanghe
     19 public class RSAEncryptUtil {
     20 
     21     //单例
     22     private static Map<Integer, String> keyMap;
     23     private static ReentrantLock lock = new ReentrantLock();
     24 
     25     //生成密钥对
     26     public static void genKeyPair() throws NoSuchAlgorithmException {
     27         if(keyMap == null) {
     28             lock.lock();
     29             if(keyMap == null) {
     30                 // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
     31                 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
     32                 // 初始化密钥对生成器,密钥大小为512-1024位
     33                 keyPairGen.initialize(512,new SecureRandom());
     34                 // 生成一个密钥对,保存在keyPair中
     35                 KeyPair keyPair = keyPairGen.generateKeyPair();
     36                 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   // 得到私钥
     37                 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 得到公钥
     38                 String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
     39                 // 得到私钥字符串
     40                 String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
     41                 // 将公钥和私钥保存到Map
     42                 keyMap = new HashMap<>();
     43                 keyMap.put(0,publicKeyString);
     44                 keyMap.put(1,privateKeyString);
     45             }
     46             lock.unlock();
     47         }
     48     }
     49 
     50     //获取公钥
     51     public static String getPublicKey() throws NoSuchAlgorithmException{
     52         if(keyMap == null) genKeyPair();
     53         return keyMap.get(0);
     54     }
     55 
     56     //获取私钥
     57     public static String getPrivateKey() throws NoSuchAlgorithmException{
     58         if(keyMap == null) genKeyPair();
     59         return keyMap.get(1);
     60     }
     61 
     62     //加密
     63     public static String encrypt(String str) throws Exception {
     64         return encrypt(str, getPrivateKey());
     65     }
     66     
     67     //加密
     68     public static String encrypt(String str, String publicKey ) throws Exception {
     69         //base64编码的公钥
     70         byte[] decoded = Base64.decodeBase64(publicKey);
     71         RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
     72         //RSA加密
     73         Cipher cipher = Cipher.getInstance("RSA");
     74         cipher.init(Cipher.ENCRYPT_MODE, pubKey);
     75         return Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
     76     }
     77 
     78     //解密
     79     public static String decrypt(String str) throws Exception {
     80         return decrypt(str, getPrivateKey());
     81     }
     82     
     83     //解密
     84     public static String decrypt(String str, String privateKey) throws Exception {
     85         //64位解码加密后的字符串
     86         byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
     87         //base64编码的私钥
     88         byte[] decoded = Base64.decodeBase64(privateKey);
     89         RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
     90         //RSA解密
     91         Cipher cipher = Cipher.getInstance("RSA");
     92         cipher.init(Cipher.DECRYPT_MODE, priKey);
     93         return new String(cipher.doFinal(inputByte));
     94     }
     95 
     96     public static void main(String[] args) throws Exception {
     97         //加密字符串
     98         String message = "guanghe";
     99         System.out.println("随机生成的公钥为:" + getPublicKey());
    100         System.out.println("随机生成的私钥为:" + getPrivateKey());
    101         String messageEn = encrypt(message,getPublicKey());
    102         System.out.println(message + "	加密后的字符串为:" + messageEn);
    103         String messageDe = decrypt(messageEn,getPrivateKey());
    104         System.out.println("还原后的字符串为:" + messageDe);
    105     }
    106 
    107 }
  • 相关阅读:
    proto,生成指定包名的java类
    龋齿比较深了还能补吗
    Spring Security with JWT for REST API[转]
    ci-Model使用方法
    ci-crud增删改查基本操作
    openjdk11 下载地址
    System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found or is out of date.
    Newtonsoft.Json高级用法之枚举中文转义
    java中文与unicode编码之间的转换
    SpringBoot参数校验-Validator
  • 原文地址:https://www.cnblogs.com/guanghe/p/13565423.html
Copyright © 2011-2022 走看看