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 }

 

posted @ 2018-03-12 17:46  landv  阅读(4228)  评论(0编辑  收藏  举报