java:常见加密解密算法的实现:MD5/SHA/HMAC/DES/PBE/AES/RSA/D-H

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值