zoukankan      html  css  js  c++  java
  • java加密解密

       1 package com.jetsum.util;
       2 
       3 import java.io.FileInputStream;
       4 import java.io.FileNotFoundException;
       5 import java.io.IOException;
       6 import java.security.InvalidAlgorithmParameterException;
       7 import java.security.InvalidKeyException;
       8 import java.security.Key;
       9 import java.security.KeyFactory;
      10 import java.security.KeyPair;
      11 import java.security.KeyPairGenerator;
      12 import java.security.KeyStore;
      13 import java.security.KeyStoreException;
      14 import java.security.MessageDigest;
      15 import java.security.NoSuchAlgorithmException;
      16 import java.security.PrivateKey;
      17 import java.security.PublicKey;
      18 import java.security.SecureRandom;
      19 import java.security.Signature;
      20 import java.security.SignatureException;
      21 import java.security.UnrecoverableKeyException;
      22 import java.security.cert.Certificate;
      23 import java.security.cert.CertificateException;
      24 import java.security.cert.CertificateFactory;
      25 import java.security.cert.X509Certificate;
      26 import java.security.interfaces.RSAPrivateKey;
      27 import java.security.interfaces.RSAPublicKey;
      28 import java.security.spec.AlgorithmParameterSpec;
      29 import java.security.spec.InvalidKeySpecException;
      30 import java.security.spec.PKCS8EncodedKeySpec;
      31 import java.security.spec.X509EncodedKeySpec;
      32 import java.util.Date;
      33 import java.util.HashMap;
      34 import java.util.Map;
      35 import java.util.Random;
      36 
      37 import javax.crypto.BadPaddingException;
      38 import javax.crypto.Cipher;
      39 import javax.crypto.IllegalBlockSizeException;
      40 import javax.crypto.KeyAgreement;
      41 import javax.crypto.KeyGenerator;
      42 import javax.crypto.Mac;
      43 import javax.crypto.NoSuchPaddingException;
      44 import javax.crypto.SecretKey;
      45 import javax.crypto.SecretKeyFactory;
      46 import javax.crypto.interfaces.DHPrivateKey;
      47 import javax.crypto.interfaces.DHPublicKey;
      48 import javax.crypto.spec.DHParameterSpec;
      49 import javax.crypto.spec.IvParameterSpec;
      50 import javax.crypto.spec.PBEKeySpec;
      51 import javax.crypto.spec.PBEParameterSpec;
      52 import javax.crypto.spec.SecretKeySpec;
      53 
      54 public class CipherUtil {
      55 
      56     /**
      57      * MD5算法
      58      */
      59     private static final String ALGORITHM_MD5 = "MD5";
      60     /**
      61      * SHA算法
      62      */
      63     private static final String ALGORITHM_SHA = "SHA";
      64     /**
      65      * HMAC算法
      66      */
      67     private static final String ALGORITHM_MAC = "HmacMD5";
      68     /**
      69      * DES算法
      70      */
      71     private static final String ALGORITHM_DES = "DES";
      72     /**
      73      * PBE算法
      74      */
      75     private static final String ALGORITHM_PBE = "PBEWITHMD5andDES";
      76 
      77     /**
      78      * AESkey
      79      */
      80     private static final String KEY_AES = "AES";
      81 
      82     /**
      83      * AES算法
      84      */
      85     private static final String ALGORITHM_AES = "AES/CBC/PKCS5Padding";
      86 
      87     /**
      88      * RSA算法
      89      */
      90     private static final String KEY_ALGORITHM = "RSA";
      91 
      92     /**
      93      * 数字签名
      94      */
      95     private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
      96 
      97     /**
      98      * 公钥
      99      */
     100     private static final String RSAPUBLIC_KEY = "RSAPublicKey";
     101 
     102     /**
     103      * 私钥
     104      */
     105     private static final String RSAPRIVATE_KEY = "RSAPrivateKey";
     106 
     107     /**
     108      * D-H算法
     109      */
     110     private static final String ALGORITHM_DH = "DH";
     111 
     112     /**
     113      * 默认密钥字节数
     114      *
     115      * <pre>
     116      * DH
     117      * Default Keysize 1024
     118      * Keysize must be a multiple of 64, ranging from 512 to 1024 (inclusive).
     119      * </pre>
     120      */
     121     private static final int DH_KEY_SIZE = 1024;
     122 
     123     /**
     124      * DH加密下需要一种对称加密算法对数据加密,这里我们使用DES,也可以使用其他对称加密算法。
     125      */
     126     private static final String SECRET_ALGORITHM = "DES";
     127 
     128     /**
     129      * DH公钥
     130      */
     131     private static final String DHPUBLIC_KEY = "DHPublicKey";
     132 
     133     /**
     134      * DH私钥
     135      */
     136     private static final String DHPRIVATE_KEY = "DHPrivateKey";
     137 
     138     /**
     139      * Java密钥库(Java Key Store,JKS)KEY_STORE
     140      */
     141     private static final String KEY_STORE = "JKS";
     142 
     143     private static final String X509 = "X.509";
     144 
     145     /**
     146      * 信息摘要算法
     147      * @param algorithm 算法类型
     148      * @param data 要加密的字符串
     149      * @return 返回加密后的摘要信息
     150      */
     151     private static String encryptEncode(String algorithm, String data) {
     152         try {
     153             MessageDigest md = MessageDigest.getInstance(algorithm);
     154             return TranscodeUtil.byteArrayToHexStr(md.digest(data.getBytes()));
     155         } catch(NoSuchAlgorithmException ex) {
     156             ex.printStackTrace();
     157         }
     158         return null;
     159     }
     160 
     161     /**
     162      * 使用MD5加密
     163      * @param data 要加密的字符串
     164      * @return 返回加密后的信息
     165      */
     166     public static String MD5Encode(String data) {
     167         return encryptEncode(ALGORITHM_MD5, data);
     168     }
     169 
     170     /**
     171      * 使用SHA加密
     172      * @param data 要加密的字符串
     173      * @return 返回加密后的信息
     174      */
     175     public static String SHAEncode(String data) {
     176         return encryptEncode(ALGORITHM_SHA, data);
     177     }
     178 
     179     /**
     180      * 生成HMAC密钥
     181      * @return 返回密钥信息
     182      */
     183     public static String generateMACKey() {
     184         try {
     185             KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM_MAC);
     186             SecretKey secretKey = keyGenerator.generateKey();
     187             return TranscodeUtil.byteArrayToBase64Str(secretKey.getEncoded());
     188         } catch (NoSuchAlgorithmException e) {
     189             e.printStackTrace();
     190         }
     191         return null;
     192     }
     193 
     194     /**
     195      * 使用HMAC加密
     196      * @param data 要加密的字符串
     197      * @param key 密钥
     198      * @return 返回加密后的信息
     199      */
     200     public static String HMACEncode(String data, String key) {
     201         Key k = toKey(key,ALGORITHM_MAC);
     202         try {
     203             Mac mac = Mac.getInstance(k.getAlgorithm());
     204             mac.init(k);
     205             return TranscodeUtil.byteArrayToBase64Str(mac.doFinal(data.getBytes()));
     206         } catch (NoSuchAlgorithmException e) {
     207             e.printStackTrace();
     208         } catch (InvalidKeyException e) {
     209             e.printStackTrace();
     210         }
     211         return null;
     212     }
     213 
     214     /**
     215      * 将base64编码后的密钥字符串转换成密钥对象
     216      * @param key 密钥字符串
     217      * @param algorithm 加密算法
     218      * @return 返回密钥对象
     219      */
     220     private static Key toKey(String key,String algorithm) {
     221         SecretKey secretKey = new SecretKeySpec(TranscodeUtil.base64StrToByteArray(key), algorithm);
     222         return secretKey;
     223     }
     224 
     225     /**
     226      * 生成DES密钥
     227      * @param seed 密钥种子
     228      * @return 返回base64编码的密钥字符串
     229      */
     230     public static String generateDESKey(String seed) {
     231         try {
     232             KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_DES);
     233             kg.init(new SecureRandom(seed.getBytes()));
     234             SecretKey secretKey = kg.generateKey();
     235             return TranscodeUtil.byteArrayToBase64Str(secretKey.getEncoded());
     236         } catch (NoSuchAlgorithmException e) {
     237             e.printStackTrace();
     238         }
     239         return null;
     240     }
     241 
     242     /**
     243      * DES加密
     244      * @param data 要加密的数据
     245      * @param key 密钥
     246      * @return 返回加密后的数据(经过base64编码)
     247      */
     248     public static String DESEncrypt(String data,String key) {
     249         return DESCipher(data,key,Cipher.ENCRYPT_MODE);
     250     }
     251 
     252     /**
     253      * DES解密
     254      * @param data 要解密的数据
     255      * @param key 密钥
     256      * @return 返回解密后的数据
     257      */
     258     public static String DESDecrypt(String data, String key) {
     259         return DESCipher(data,key,Cipher.DECRYPT_MODE);
     260     }
     261 
     262     /**
     263      * DES的加密解密
     264      * @param data 要加密或解密的数据
     265      * @param key 密钥
     266      * @param mode 加密或解密模式
     267      * @return 返回加密或解密的数据
     268      */
     269     private static String DESCipher(String data, String key, int mode) {
     270         try {
     271             Key k = toKey(key,ALGORITHM_DES);
     272             Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
     273             cipher.init(mode, k);
     274             return mode == Cipher.DECRYPT_MODE?new String(cipher.doFinal(TranscodeUtil.base64StrToByteArray(data))):TranscodeUtil.byteArrayToBase64Str(cipher.doFinal(data.getBytes()));
     275         } catch (Exception e) {
     276             e.printStackTrace();
     277         }
     278         return null;
     279     }
     280 
     281     /**
     282      * 生成盐
     283      * @return 返回base64编码后的盐信息
     284      */
     285     public static String generatePBESalt() {
     286         byte[] salt = new byte[8];
     287         Random random = new Random();
     288         random.nextBytes(salt);
     289         return TranscodeUtil.byteArrayToBase64Str(salt);
     290     }
     291 
     292     /**
     293      * PBE(Password-based encryption基于密码加密)加密
     294      * @param data 要加密的数据
     295      * @param password 密码
     296      * @param salt 盐
     297      * @return 返回加密后的数据(经过base64编码)
     298      */
     299     public static String PBEEncrypt(String data,String password,String salt) {
     300         return PBECipher( data, password, salt, Cipher.ENCRYPT_MODE);
     301     }
     302 
     303     /**
     304      * PBE(Password-based encryption基于密码加密)解密
     305      * @param data 要解密的数据
     306      * @param password 密码
     307      * @param salt 盐
     308      * @return 返回解密后的数据
     309      */
     310     public static String PBEDecrypt(String data,String password,String salt) {
     311         return PBECipher( data, password, salt, Cipher.DECRYPT_MODE);
     312     }
     313 
     314     /**
     315      * PBE加密解密
     316      * @param data 要加密解密的信息
     317      * @param password 密码
     318      * @param salt 盐
     319      * @param mode 加密或解密模式
     320      * @return 返回加密解密后的数据
     321      */
     322     private static String PBECipher(String data,String password,String salt,int mode) {
     323         try {
     324             Key secretKey = toPBEKey(password);
     325             PBEParameterSpec paramSpec = new PBEParameterSpec(TranscodeUtil.base64StrToByteArray(salt), 100);
     326             Cipher cipher = Cipher.getInstance(ALGORITHM_PBE);
     327             cipher.init(mode, secretKey, paramSpec);
     328             return mode == Cipher.DECRYPT_MODE?new String(cipher.doFinal(TranscodeUtil.base64StrToByteArray(data))):TranscodeUtil.byteArrayToBase64Str(cipher.doFinal(data.getBytes()));
     329         } catch (NoSuchAlgorithmException e) {
     330             e.printStackTrace();
     331         } catch (NoSuchPaddingException e) {
     332             e.printStackTrace();
     333         } catch (InvalidKeyException e) {
     334             e.printStackTrace();
     335         } catch (InvalidAlgorithmParameterException e) {
     336             e.printStackTrace();
     337         } catch (IllegalBlockSizeException e) {
     338             e.printStackTrace();
     339         } catch (BadPaddingException e) {
     340             e.printStackTrace();
     341         }
     342         return null;
     343     }
     344 
     345     /**
     346      * 生成PBEkey
     347      * @param password 使用的密码
     348      * @return 返回生成的PBEkey
     349      */
     350     private static Key toPBEKey(String password) {
     351         PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
     352         try {
     353             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM_PBE);
     354             SecretKey secretKey = keyFactory.generateSecret(keySpec);
     355             return secretKey;
     356         } catch (NoSuchAlgorithmException e) {
     357             e.printStackTrace();
     358         } catch (InvalidKeySpecException e) {
     359             e.printStackTrace();
     360         }
     361         return null;
     362     }
     363 
     364     /**
     365      * 生成AESkey
     366      * @param keySize key的位数
     367      * @param seed 随机种子
     368      * @return 返回base64编码后的key信息
     369      */
     370     public static String generateAESKey(int keySize,String seed) {
     371         try {
     372             KeyGenerator kgen = KeyGenerator.getInstance(KEY_AES);
     373             kgen.init(keySize,new SecureRandom(seed.getBytes()));
     374             SecretKey key = kgen.generateKey();
     375             return TranscodeUtil.byteArrayToBase64Str(key.getEncoded());
     376         } catch (NoSuchAlgorithmException e) {
     377             e.printStackTrace();
     378         }
     379         return null;
     380     }
     381 
     382     /**
     383      * AES加密
     384      * @param data 要加密的数据
     385      * @param key 密钥
     386      * @param algorithmParameter 算法参数
     387      * @return 返回加密数据
     388      */
     389     public static String AESEncrypt(String data,String key,String algorithmParameter) {
     390         return AESCipher(data, key, algorithmParameter,Cipher.ENCRYPT_MODE);
     391     }
     392 
     393     /**
     394      * AES解密
     395      * @param data 要解密的数据
     396      * @param key 密钥
     397      * @param algorithmParameter 算法参数
     398      * @return 返回解密数据
     399      */
     400     public static String AESDecrypt(String data,String key,String algorithmParameter) {
     401         return AESCipher(data, key, algorithmParameter,Cipher.DECRYPT_MODE);
     402     }
     403 
     404     /**
     405      * 实现AES加密解密
     406      * @param data 要加密或解密的数据
     407      * @param key 密钥
     408      * @param algorithmParameter 算法参数
     409      * @param mode 加密或解密
     410      * @return 返回加密或解密的数据
     411      */
     412     private static String AESCipher(String data, String key, String algorithmParameter,int mode) {
     413         try {
     414             Key k = toKey(key,KEY_AES);
     415             AlgorithmParameterSpec paramSpec = new IvParameterSpec(algorithmParameter.getBytes());
     416             Cipher ecipher = Cipher.getInstance(ALGORITHM_AES);
     417             ecipher.init(mode, k, paramSpec);
     418             return mode==Cipher.DECRYPT_MODE?new String(ecipher.doFinal(TranscodeUtil.base64StrToByteArray(data))):TranscodeUtil.byteArrayToBase64Str(ecipher.doFinal(data.getBytes()));
     419         } catch (NoSuchAlgorithmException e) {
     420             e.printStackTrace();
     421         } catch (NoSuchPaddingException e) {
     422             e.printStackTrace();
     423         } catch (InvalidKeyException e) {
     424             e.printStackTrace();
     425         } catch (InvalidAlgorithmParameterException e) {
     426             e.printStackTrace();
     427         } catch (IllegalBlockSizeException e) {
     428             e.printStackTrace();
     429         } catch (BadPaddingException e) {
     430             e.printStackTrace();
     431         }
     432         return null;
     433     }
     434 
     435     /**
     436      * 数字签名
     437      * @param data 要签名的密文
     438      * @param privateKey 私钥
     439      * @return 返回签名信息
     440      */
     441     public static String RSASign(String data, String privateKey) {
     442         try {
     443             // 解密由base64编码的私钥
     444             byte[] keyBytes = TranscodeUtil.base64StrToByteArray(privateKey);
     445             // 构造PKCS8EncodedKeySpec对象
     446             PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
     447             // KEY_ALGORITHM 指定的加密算法
     448             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     449             // 取私钥匙对象
     450             PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
     451             // 用私钥对信息生成数字签名
     452             Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
     453             signature.initSign(priKey);
     454             signature.update(TranscodeUtil.base64StrToByteArray(data));
     455             return TranscodeUtil.byteArrayToBase64Str(signature.sign());
     456         } catch(NoSuchAlgorithmException e) {
     457             e.printStackTrace();
     458         } catch (InvalidKeySpecException e) {
     459             e.printStackTrace();
     460         } catch (InvalidKeyException e) {
     461             e.printStackTrace();
     462         } catch (SignatureException e) {
     463             e.printStackTrace();
     464         }
     465         return null;
     466     }
     467 
     468     /**
     469      * 验证签名
     470      * @param data 要验证的密文
     471      * @param publicKey 公钥
     472      * @param sign 签名信息
     473      * @return 返回验证成功状态
     474      */
     475     public static boolean RSAVerify(String data, String publicKey, String sign) {
     476         try {
     477             // 解密由base64编码的公钥
     478             byte[] keyBytes = TranscodeUtil.base64StrToByteArray(publicKey);
     479             // 构造X509EncodedKeySpec对象
     480             X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
     481             // KEY_ALGORITHM 指定的加密算法
     482             Signature signature;
     483             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     484             // 取公钥匙对象
     485             PublicKey pubKey = keyFactory.generatePublic(keySpec);
     486             signature = Signature.getInstance(SIGNATURE_ALGORITHM);
     487             signature.initVerify(pubKey);
     488             signature.update(TranscodeUtil.base64StrToByteArray(data));
     489             // 验证签名是否正常
     490             return signature.verify(TranscodeUtil.base64StrToByteArray(sign));
     491         } catch (NoSuchAlgorithmException e) {
     492             e.printStackTrace();
     493         } catch (InvalidKeySpecException e) {
     494             e.printStackTrace();
     495         } catch (InvalidKeyException e) {
     496             e.printStackTrace();
     497         } catch (SignatureException e) {
     498             e.printStackTrace();
     499         }
     500         return false;
     501     }
     502 
     503     /**
     504      * 私钥解密
     505      * @param data 要解密的字符串
     506      * @param key 私钥
     507      * @return 返回解密后的字符串
     508      */
     509     public static String RSADecryptByPrivateKey(String data, String key) {
     510         try {
     511             // 对密钥解密
     512             byte[] keyBytes = TranscodeUtil.base64StrToByteArray(key);
     513             // 取得私钥
     514             PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
     515             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     516             Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
     517             // 对数据解密
     518             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
     519             cipher.init(Cipher.DECRYPT_MODE, privateKey);
     520             return new String(cipher.doFinal(TranscodeUtil.base64StrToByteArray(data)));
     521         } catch (NoSuchAlgorithmException e) {
     522             e.printStackTrace();
     523         } catch (InvalidKeySpecException e) {
     524             e.printStackTrace();
     525         } catch (NoSuchPaddingException e) {
     526             e.printStackTrace();
     527         } catch (InvalidKeyException e) {
     528             e.printStackTrace();
     529         } catch (IllegalBlockSizeException e) {
     530             e.printStackTrace();
     531         } catch (BadPaddingException e) {
     532             e.printStackTrace();
     533         }
     534         return null;
     535     }
     536 
     537     /**
     538      * 公钥解密
     539      * @param data 要解密的数据
     540      * @param key 公钥
     541      * @return 返回解密后的数据
     542      */
     543     public static String RSADecryptByPublicKey(String data, String key) {
     544         try {
     545             // 对密钥解密
     546             byte[] keyBytes = TranscodeUtil.base64StrToByteArray(key);
     547             // 取得公钥
     548             X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
     549             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     550             Key publicKey = keyFactory.generatePublic(x509KeySpec);
     551             // 对数据解密
     552             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
     553             cipher.init(Cipher.DECRYPT_MODE, publicKey);
     554             return new String(cipher.doFinal(TranscodeUtil.base64StrToByteArray(data)));
     555         } catch (NoSuchAlgorithmException e) {
     556             e.printStackTrace();
     557         } catch (IllegalBlockSizeException e) {
     558             e.printStackTrace();
     559         } catch (BadPaddingException e) {
     560             e.printStackTrace();
     561         } catch (InvalidKeySpecException e) {
     562             e.printStackTrace();
     563         } catch (InvalidKeyException e) {
     564             e.printStackTrace();
     565         } catch (NoSuchPaddingException e) {
     566             e.printStackTrace();
     567         }
     568         return null;
     569     }
     570 
     571     /**
     572      * 公钥加密
     573      * @param data 要加密的数据
     574      * @param key 公钥
     575      * @return 返回加密的数据
     576      */
     577     public static String RSAEncryptByPublicKey(String data, String key) {
     578         try {
     579             // 对公钥解密
     580             byte[] keyBytes = TranscodeUtil.base64StrToByteArray(key);
     581             // 取得公钥
     582             X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
     583             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     584             Key publicKey = keyFactory.generatePublic(x509KeySpec);
     585             // 对数据加密
     586             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
     587             cipher.init(Cipher.ENCRYPT_MODE, publicKey);
     588             return TranscodeUtil.byteArrayToBase64Str(cipher.doFinal(data.getBytes()));
     589         } catch (NoSuchAlgorithmException e) {
     590             e.printStackTrace();
     591         } catch (InvalidKeySpecException e) {
     592             e.printStackTrace();
     593         } catch (NoSuchPaddingException e) {
     594             e.printStackTrace();
     595         } catch (InvalidKeyException e) {
     596             e.printStackTrace();
     597         } catch (IllegalBlockSizeException e) {
     598             e.printStackTrace();
     599         } catch (BadPaddingException e) {
     600             e.printStackTrace();
     601         }
     602         return null;
     603     }
     604 
     605     /**
     606      * 私钥加密
     607      * @param data 要加密的数据
     608      * @param key 私钥
     609      * @return 返回加密后的数据
     610      */
     611     public static String RSAEncryptByPrivateKey(String data, String key) {
     612         try {
     613             // 对密钥解密
     614             byte[] keyBytes = TranscodeUtil.base64StrToByteArray(key);
     615             // 取得私钥
     616             PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
     617             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     618             Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
     619             // 对数据加密
     620             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
     621             cipher.init(Cipher.ENCRYPT_MODE, privateKey);
     622             return TranscodeUtil.byteArrayToBase64Str(cipher.doFinal(data.getBytes()));
     623         } catch (NoSuchAlgorithmException e) {
     624             e.printStackTrace();
     625         } catch (InvalidKeyException e) {
     626             e.printStackTrace();
     627         } catch (InvalidKeySpecException e) {
     628             e.printStackTrace();
     629         } catch (NoSuchPaddingException e) {
     630             e.printStackTrace();
     631         } catch (IllegalBlockSizeException e) {
     632             e.printStackTrace();
     633         } catch (BadPaddingException e) {
     634             e.printStackTrace();
     635         }
     636         return null;
     637     }
     638 
     639     /**
     640      * 获得私钥
     641      * @param keyMap 密钥对
     642      * @return 返回经过base64编码的私钥
     643      */
     644     public static String getRSAPrivateKey(Map<String, Object> keyMap) {
     645         Key key = (Key) keyMap.get(RSAPRIVATE_KEY);
     646         return TranscodeUtil.byteArrayToBase64Str(key.getEncoded());
     647     }
     648 
     649     /**
     650      * 获得公钥(base64编码)
     651      * @param keyMap 密钥对
     652      * @return 返回经过base64编码的公钥
     653      */
     654     public static String getRSAPublicKey(Map<String, Object> keyMap) {
     655         Key key = (Key) keyMap.get(RSAPUBLIC_KEY);
     656         return TranscodeUtil.byteArrayToBase64Str(key.getEncoded());
     657     }
     658 
     659     /**
     660      * 初始化密钥对
     661      * @return 返回密钥对
     662      */
     663     public static Map<String, Object> initRSAKey() {
     664         Map<String, Object> keyMap = new HashMap<String, Object>(2);
     665         try {
     666             KeyPairGenerator keyPairGen = KeyPairGenerator
     667                                           .getInstance(KEY_ALGORITHM);
     668             keyPairGen.initialize(1024);
     669             KeyPair keyPair = keyPairGen.generateKeyPair();
     670             // 公钥
     671             RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
     672             // 私钥
     673             RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
     674             keyMap.put(RSAPUBLIC_KEY, publicKey);
     675             keyMap.put(RSAPRIVATE_KEY, privateKey);
     676         } catch (NoSuchAlgorithmException e) {
     677             e.printStackTrace();
     678         }
     679         return keyMap;
     680     }
     681 
     682     /**
     683      * 初始化甲方密钥对
     684      * @return 返回甲方密钥对
     685      */
     686     public static Map<String, Object> initDHKey() {
     687         try {
     688             KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_DH);
     689             keyPairGenerator.initialize(DH_KEY_SIZE);
     690             KeyPair keyPair = keyPairGenerator.generateKeyPair();
     691             // 甲方公钥
     692             DHPublicKey publicKey = (DHPublicKey) keyPair.getPublic();
     693             // 甲方私钥
     694             DHPrivateKey privateKey = (DHPrivateKey) keyPair.getPrivate();
     695             Map<String, Object> keyMap = new HashMap<String, Object>(2);
     696             keyMap.put(DHPUBLIC_KEY, publicKey);
     697             keyMap.put(DHPRIVATE_KEY, privateKey);
     698             return keyMap;
     699         } catch (NoSuchAlgorithmException e) {
     700             e.printStackTrace();
     701         }
     702         return null;
     703     }
     704 
     705     /**
     706      * 使用甲方公钥初始化乙方密钥对
     707      * @param key 甲方公钥
     708      * @return 返回乙方密钥对
     709      */
     710     public static Map<String, Object> initDHKey(String key) {
     711         try {
     712             // 解析甲方公钥
     713             byte[] keyBytes = TranscodeUtil.base64StrToByteArray(key);
     714             X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
     715             KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_DH);
     716             PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
     717             // 由甲方公钥构建乙方密钥
     718             DHParameterSpec dhParamSpec = ((DHPublicKey) pubKey).getParams();
     719             KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(keyFactory.getAlgorithm());
     720             keyPairGenerator.initialize(dhParamSpec);
     721             KeyPair keyPair = keyPairGenerator.generateKeyPair();
     722             // 乙方公钥
     723             DHPublicKey publicKey = (DHPublicKey) keyPair.getPublic();
     724             // 乙方私钥
     725             DHPrivateKey privateKey = (DHPrivateKey) keyPair.getPrivate();
     726             Map<String, Object> keyMap = new HashMap<String, Object>(2);
     727             keyMap.put(DHPUBLIC_KEY, publicKey);
     728             keyMap.put(DHPRIVATE_KEY, privateKey);
     729             return keyMap;
     730         } catch (NoSuchAlgorithmException e) {
     731             e.printStackTrace();
     732         } catch (InvalidKeySpecException e) {
     733             e.printStackTrace();
     734         } catch (InvalidAlgorithmParameterException e) {
     735             e.printStackTrace();
     736         }
     737         return null;
     738     }
     739 
     740     /**
     741      * DH加密
     742      * @param data 要加密的数据
     743      * @param publicKey 甲方或乙方公钥
     744      * @param privateKey 甲方或乙方私钥
     745      * @return 加密结果
     746      */
     747     public static String DHEncrypt(String data, String publicKey,String privateKey) {
     748         try {
     749             // 生成本地密钥
     750             SecretKey secretKey = getDHSecretKey(publicKey, privateKey);
     751             // 数据加密
     752             Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());
     753             cipher.init(Cipher.ENCRYPT_MODE, secretKey);
     754             return TranscodeUtil.byteArrayToBase64Str(cipher.doFinal(data.getBytes()));
     755         } catch (NoSuchAlgorithmException e) {
     756             e.printStackTrace();
     757         } catch (NoSuchPaddingException e) {
     758             e.printStackTrace();
     759         } catch (InvalidKeyException e) {
     760             e.printStackTrace();
     761         } catch (IllegalBlockSizeException e) {
     762             e.printStackTrace();
     763         } catch (BadPaddingException e) {
     764             e.printStackTrace();
     765         }
     766         return null;
     767     }
     768 
     769     /**
     770      * DH解密
     771      * @param data 要解密的数据
     772      * @param publicKey 公钥
     773      * @param privateKey 私钥
     774      * @return 返回解密结果
     775      */
     776     public static String DHDecrypt(String data, String publicKey,String privateKey) {
     777         try {
     778             // 生成本地密钥
     779             SecretKey secretKey = getDHSecretKey(publicKey, privateKey);
     780             // 数据解密
     781             Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());
     782             cipher.init(Cipher.DECRYPT_MODE, secretKey);
     783             return new String(cipher.doFinal(TranscodeUtil.base64StrToByteArray(data)));
     784         } catch (NoSuchAlgorithmException e) {
     785             e.printStackTrace();
     786         } catch (NoSuchPaddingException e) {
     787             e.printStackTrace();
     788         } catch (InvalidKeyException e) {
     789             e.printStackTrace();
     790         } catch (IllegalBlockSizeException e) {
     791             e.printStackTrace();
     792         } catch (BadPaddingException e) {
     793             e.printStackTrace();
     794         }
     795         return null;
     796     }
     797 
     798     /**
     799      * 生成本地密钥
     800      * @param publicKey 公钥
     801      * @param privateKey 私钥
     802      * @return 返回本地密钥
     803      */
     804     private static SecretKey getDHSecretKey(String publicKey, String privateKey) {
     805         try {
     806             // 初始化公钥
     807             byte[] pubKeyBytes = TranscodeUtil.base64StrToByteArray(publicKey);
     808             KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_DH);
     809             X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKeyBytes);
     810             PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
     811             // 初始化私钥
     812             byte[] priKeyBytes = TranscodeUtil.base64StrToByteArray(privateKey);
     813             PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKeyBytes);
     814             Key priKey = keyFactory.generatePrivate(pkcs8KeySpec);
     815             KeyAgreement keyAgree = KeyAgreement.getInstance(keyFactory.getAlgorithm());
     816             keyAgree.init(priKey);
     817             keyAgree.doPhase(pubKey, true);
     818             // 生成本地密钥
     819             SecretKey secretKey = keyAgree.generateSecret(SECRET_ALGORITHM);
     820             return secretKey;
     821         } catch (NoSuchAlgorithmException e) {
     822             e.printStackTrace();
     823         } catch (InvalidKeySpecException e) {
     824             e.printStackTrace();
     825         } catch (InvalidKeyException e) {
     826             e.printStackTrace();
     827         }
     828         return null;
     829     }
     830 
     831     /**
     832      * 获取私钥
     833      * @param keyMap 密钥对
     834      * @return 返回base64编码的私钥
     835      */
     836     public static String getDHPrivateKey(Map<String, Object> keyMap) {
     837         Key key = (Key) keyMap.get(DHPRIVATE_KEY);
     838         return TranscodeUtil.byteArrayToBase64Str(key.getEncoded());
     839     }
     840 
     841     /**
     842      * 获取公钥
     843      * @param keyMap 密钥对
     844      * @return 返回base64编码的公钥
     845      */
     846     public static String getDHPublicKey(Map<String, Object> keyMap) {
     847         Key key = (Key) keyMap.get(DHPUBLIC_KEY);
     848         return TranscodeUtil.byteArrayToBase64Str(key.getEncoded());
     849     }
     850 
     851     /**
     852      * 获取私钥
     853      * @param keyStorePath keystore文件路径
     854      * @param alias 别名
     855      * @param password 密码
     856      * @return 返回私钥
     857      */
     858     private static PrivateKey getKeyStorePrivateKey(String keyStorePath, String alias,String password) {
     859         try {
     860             KeyStore ks = getKeyStore(keyStorePath, password);
     861             PrivateKey key = (PrivateKey) ks.getKey(alias, password.toCharArray());
     862             return key;
     863         } catch (UnrecoverableKeyException e) {
     864             e.printStackTrace();
     865         } catch (KeyStoreException e) {
     866             e.printStackTrace();
     867         } catch (NoSuchAlgorithmException e) {
     868             e.printStackTrace();
     869         }
     870         return null;
     871     }
     872 
     873     /**
     874      * 获取公钥
     875      * @param certificatePath 证书文件路径
     876      * @return 返回公钥
     877      */
     878     private static PublicKey getCertificatePublicKey(String certificatePath) {
     879         try {
     880             Certificate certificate = getCertificate(certificatePath);
     881             PublicKey key = certificate.getPublicKey();
     882             return key;
     883         } catch (Exception e) {
     884             e.printStackTrace();
     885         }
     886         return null;
     887     }
     888 
     889     /**
     890      * 加载证书文件
     891      * @param certificatePath 证书文件路径
     892      * @return 返回证书
     893      */
     894     private static Certificate getCertificate(String certificatePath) {
     895         try {
     896             CertificateFactory certificateFactory = CertificateFactory.getInstance(X509);
     897             FileInputStream in = new FileInputStream(certificatePath);
     898             Certificate certificate = certificateFactory.generateCertificate(in);
     899             in.close();
     900             return certificate;
     901         } catch (CertificateException e) {
     902             e.printStackTrace();
     903         } catch (FileNotFoundException e) {
     904             e.printStackTrace();
     905         } catch (IOException e) {
     906             e.printStackTrace();
     907         }
     908         return null;
     909     }
     910 
     911     /**
     912      * 获取证书
     913      * @param keyStorePath keystore文件路径
     914      * @param alias 别名
     915      * @param password 密码
     916      * @return 返回证书
     917      */
     918     private static Certificate getCertificate(String keyStorePath,String alias, String password) {
     919         try {
     920             KeyStore ks = getKeyStore(keyStorePath, password);
     921             Certificate certificate = ks.getCertificate(alias);
     922             return certificate;
     923         } catch (KeyStoreException e) {
     924             e.printStackTrace();
     925         }
     926         return null;
     927     }
     928 
     929     /**
     930      * 加载KeyStore文件
     931      * @param keyStorePath keystore文件地址
     932      * @param password keystore密码
     933      * @return 返回KeyStore
     934      */
     935     private static KeyStore getKeyStore(String keyStorePath, String password) {
     936         try {
     937             FileInputStream is = new FileInputStream(keyStorePath);
     938             KeyStore ks = KeyStore.getInstance(KEY_STORE);
     939             ks.load(is, password.toCharArray());
     940             is.close();
     941             return ks;
     942         } catch (FileNotFoundException e) {
     943             e.printStackTrace();
     944         } catch (KeyStoreException e) {
     945             e.printStackTrace();
     946         } catch (NoSuchAlgorithmException e) {
     947             e.printStackTrace();
     948         } catch (CertificateException e) {
     949             e.printStackTrace();
     950         } catch (IOException e) {
     951             e.printStackTrace();
     952         }
     953         return null;
     954     }
     955 
     956     /**
     957      * 加密数据
     958      * @param data 要加密的数据
     959      * @param keyStorePath keystore路径
     960      * @param alias 别名
     961      * @param password 密码
     962      * @return 返回加密后的数据
     963      */
     964     public static String encryptByPrivateKey(String data, String keyStorePath,
     965             String alias, String password) {
     966         try {
     967             // 取得私钥
     968             PrivateKey privateKey = getKeyStorePrivateKey(keyStorePath, alias, password);
     969             // 对数据加密
     970             Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
     971             cipher.init(Cipher.ENCRYPT_MODE, privateKey);
     972             return TranscodeUtil.byteArrayToBase64Str(cipher.doFinal(data.getBytes()));
     973         } catch (NoSuchAlgorithmException e) {
     974             e.printStackTrace();
     975         } catch (NoSuchPaddingException e) {
     976             e.printStackTrace();
     977         } catch (InvalidKeyException e) {
     978             e.printStackTrace();
     979         } catch (IllegalBlockSizeException e) {
     980             e.printStackTrace();
     981         } catch (BadPaddingException e) {
     982             e.printStackTrace();
     983         }
     984         return null;
     985     }
     986 
     987     /**
     988      * 私钥解密
     989      * @param data 要解密的数据
     990      * @param keyStorePath keystore路径
     991      * @param alias 别名
     992      * @param password 密码
     993      * @return 返回解密后的数据
     994      */
     995     public static String decryptByPrivateKey(String data, String keyStorePath,String alias, String password) {
     996         try {
     997             // 取得私钥
     998             PrivateKey privateKey = getKeyStorePrivateKey(keyStorePath, alias, password);
     999             // 对数据加密
    1000             Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
    1001             cipher.init(Cipher.DECRYPT_MODE, privateKey);
    1002             return new String(cipher.doFinal(TranscodeUtil.base64StrToByteArray(data)));
    1003         } catch (NoSuchAlgorithmException e) {
    1004             e.printStackTrace();
    1005         } catch (NoSuchPaddingException e) {
    1006             e.printStackTrace();
    1007         } catch (InvalidKeyException e) {
    1008             e.printStackTrace();
    1009         } catch (IllegalBlockSizeException e) {
    1010             e.printStackTrace();
    1011         } catch (BadPaddingException e) {
    1012             e.printStackTrace();
    1013         }
    1014         return null;
    1015     }
    1016 
    1017     /**
    1018      * 私钥加密
    1019      * @param data 要加密的数据
    1020      * @param certificatePath 证书路径
    1021      * @return 返回加密后的信息
    1022      */
    1023     public static String encryptByPublicKey(String data, String certificatePath) {
    1024         try {
    1025             // 取得公钥
    1026             PublicKey publicKey = getCertificatePublicKey(certificatePath);
    1027             // 对数据加密
    1028             Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
    1029             cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    1030             return TranscodeUtil.byteArrayToBase64Str(cipher.doFinal(data.getBytes()));
    1031         } catch (NoSuchAlgorithmException e) {
    1032             e.printStackTrace();
    1033         } catch (NoSuchPaddingException e) {
    1034             e.printStackTrace();
    1035         } catch (InvalidKeyException e) {
    1036             e.printStackTrace();
    1037         } catch (IllegalBlockSizeException e) {
    1038             e.printStackTrace();
    1039         } catch (BadPaddingException e) {
    1040             e.printStackTrace();
    1041         }
    1042         return null;
    1043     }
    1044 
    1045     /**
    1046      * 公钥解密
    1047      * @param data 要解密的数据
    1048      * @param certificatePath 证书路径
    1049      * @return 返回解密信息
    1050      */
    1051     public static String decryptByPublicKey(String data, String certificatePath) {
    1052         try {
    1053             // 取得公钥
    1054             PublicKey publicKey = getCertificatePublicKey(certificatePath);
    1055             // 对数据加密
    1056             Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
    1057             cipher.init(Cipher.DECRYPT_MODE, publicKey);
    1058             return new String(cipher.doFinal(TranscodeUtil.base64StrToByteArray(data)));
    1059         } catch (NoSuchAlgorithmException e) {
    1060             e.printStackTrace();
    1061         } catch (NoSuchPaddingException e) {
    1062             e.printStackTrace();
    1063         } catch (InvalidKeyException e) {
    1064             e.printStackTrace();
    1065         } catch (IllegalBlockSizeException e) {
    1066             e.printStackTrace();
    1067         } catch (BadPaddingException e) {
    1068             e.printStackTrace();
    1069         }
    1070         return null;
    1071     }
    1072 
    1073     /**
    1074      * 验证证书是否过期
    1075      * @param certificatePath 证书路径
    1076      * @return 返回验证结果
    1077      */
    1078     public static boolean verifyCertificate(String certificatePath) {
    1079         return verifyCertificate(new Date(), certificatePath);
    1080     }
    1081 
    1082     /**
    1083      * 验证证书是否过期
    1084      * @param date 日期
    1085      * @param certificatePath 证书路径
    1086      * @return 返回验证结果
    1087      */
    1088     public static boolean verifyCertificate(Date date, String certificatePath) {
    1089         boolean status = true;
    1090         try {
    1091             // 取得证书
    1092             Certificate certificate = getCertificate(certificatePath);
    1093             // 验证证书是否过期或无效
    1094             status = verifyCertificate(date, certificate);
    1095         } catch (Exception e) {
    1096             status = false;
    1097         }
    1098         return status;
    1099     }
    1100 
    1101     /**
    1102      * 验证证书是否过期
    1103      * @param date 日期
    1104      * @param certificate 证书
    1105      * @return 返回验证结果
    1106      */
    1107     private static boolean verifyCertificate(Date date, Certificate certificate) {
    1108         boolean status = true;
    1109         try {
    1110             X509Certificate x509Certificate = (X509Certificate) certificate;
    1111             x509Certificate.checkValidity(date);
    1112         } catch (Exception e) {
    1113             status = false;
    1114         }
    1115         return status;
    1116     }
    1117 
    1118     /**
    1119      * 对于数据进行签名
    1120      * @param sign 要签名的信息
    1121      * @param keyStorePath keystore文件位置
    1122      * @param alias 别名
    1123      * @param password 密码
    1124      * @return 返回签名信息
    1125      */
    1126     public static String sign(String sign, String keyStorePath, String alias,String password) {
    1127         try {
    1128             // 获得证书
    1129             X509Certificate x509Certificate = (X509Certificate) getCertificate(
    1130                                                   keyStorePath, alias, password);
    1131             // 获取私钥
    1132             KeyStore ks = getKeyStore(keyStorePath, password);
    1133             // 取得私钥
    1134             PrivateKey privateKey = (PrivateKey) ks.getKey(alias, password
    1135                                     .toCharArray());
    1136             // 构建签名
    1137             Signature signature = Signature.getInstance(x509Certificate
    1138                                   .getSigAlgName());
    1139             signature.initSign(privateKey);
    1140             signature.update(TranscodeUtil.base64StrToByteArray(sign));
    1141             return TranscodeUtil.byteArrayToBase64Str(signature.sign());
    1142         } catch (UnrecoverableKeyException e) {
    1143             e.printStackTrace();
    1144         } catch (KeyStoreException e) {
    1145             e.printStackTrace();
    1146         } catch (NoSuchAlgorithmException e) {
    1147             e.printStackTrace();
    1148         } catch (InvalidKeyException e) {
    1149             e.printStackTrace();
    1150         } catch (SignatureException e) {
    1151             e.printStackTrace();
    1152         }
    1153         return null;
    1154     }
    1155 
    1156     /**
    1157      * 验证签名信息
    1158      * @param data 要验证的信息
    1159      * @param sign 签名信息
    1160      * @param certificatePath 证书路径
    1161      * @return 返回验证结果
    1162      */
    1163     public static boolean verify(String data, String sign,String certificatePath) {
    1164         try {
    1165             // 获得证书
    1166             X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath);
    1167             // 获得公钥
    1168             PublicKey publicKey = x509Certificate.getPublicKey();
    1169             // 构建签名
    1170             Signature signature = Signature.getInstance(x509Certificate
    1171                                   .getSigAlgName());
    1172             signature.initVerify(publicKey);
    1173             signature.update(TranscodeUtil.base64StrToByteArray(data));
    1174             return signature.verify(TranscodeUtil.base64StrToByteArray(sign));
    1175         } catch (NoSuchAlgorithmException e) {
    1176             e.printStackTrace();
    1177         } catch (InvalidKeyException e) {
    1178             e.printStackTrace();
    1179         } catch (SignatureException e) {
    1180             e.printStackTrace();
    1181         }
    1182         return false;
    1183     }
    1184 
    1185     /**
    1186      * 验证证书
    1187      * @param date 日期
    1188      * @param keyStorePath keystore文件路径
    1189      * @param alias 别名
    1190      * @param password 密码
    1191      * @return 返回验证结果
    1192      */
    1193     public static boolean verifyCertificate(Date date, String keyStorePath,
    1194                                             String alias, String password) {
    1195         boolean status = true;
    1196         try {
    1197             Certificate certificate = getCertificate(keyStorePath, alias,
    1198                                       password);
    1199             status = verifyCertificate(date, certificate);
    1200         } catch (Exception e) {
    1201             status = false;
    1202         }
    1203         return status;
    1204     }
    1205 
    1206     /**
    1207      * 验证证书
    1208      * @param keyStorePath keystore文件路径
    1209      * @param alias 别名
    1210      * @param password 密码
    1211      * @return 返回验证结果
    1212      */
    1213     public static boolean verifyCertificate(String keyStorePath, String alias,
    1214                                             String password) {
    1215         return verifyCertificate(new Date(), keyStorePath, alias, password);
    1216     }
    1217 
    1218 }
  • 相关阅读:
    程序员推荐书籍汇总
    mysql优化之表建设
    curl_setopt用此函数设置上传文件请求的兼容性调整
    VIM使用总结
    HDU3709 Balanced Number (数位dp)
    POJ2796 单调队列
    HDU 4870 Rating (2014 Multi-University Training Contest 1)
    HDU 4869 Turn the pokers (2014 Multi-University Training Contest 1)
    HDU 4864 (2014 Multi-University Training Contest 1 )
    Go Deeper(2010成都现场赛题)(2-sat)
  • 原文地址:https://www.cnblogs.com/landv/p/8550621.html
Copyright © 2011-2022 走看看