| package com.doumee.core.utils; | 
|   | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.doumee.core.constants.ResponseStatus; | 
| import com.doumee.core.exception.BusinessException; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.data.redis.core.RedisTemplate; | 
|   | 
| import javax.crypto.Cipher; | 
| import javax.crypto.CipherInputStream; | 
| import javax.crypto.CipherOutputStream; | 
| import javax.crypto.SecretKeyFactory; | 
| import javax.crypto.spec.DESKeySpec; | 
| import javax.crypto.spec.IvParameterSpec; | 
| import java.io.*; | 
| import java.security.Key; | 
| import java.util.Base64; | 
| import java.util.concurrent.TimeUnit; | 
|   | 
| public class DESUtil { | 
|   | 
|     /** | 
|      * 偏移变量,固定占8位字节 | 
|      */ | 
|     private final static String IV_PARAMETER = "12345678"; | 
|     /** | 
|      * 密钥算法 | 
|      */ | 
|     private static final String ALGORITHM = "DES"; | 
|     /** | 
|      * 加密/解密算法-工作模式-填充模式 | 
|      */ | 
|     private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding"; | 
|     /** | 
|      * 默认编码 | 
|      */ | 
|     private static final String CHARSET = "utf-8"; | 
|   | 
|     /** | 
|      * 生成key | 
|      * | 
|      * @param password | 
|      * @return | 
|      * @throws Exception | 
|      */ | 
|     private static Key generateKey(String password) throws Exception { | 
|         DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET)); | 
|         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); | 
|         return keyFactory.generateSecret(dks); | 
|     } | 
|   | 
|   | 
|     /** | 
|      * DES加密字符串 | 
|      * | 
|      * @param password 加密密码,长度不能够小于8位 | 
|      * @param data 待加密字符串 | 
|      * @return 加密后内容 | 
|      */ | 
|     public static String encrypt(String password, String data) { | 
|         if (password== null || password.length() < 8) { | 
|             throw new RuntimeException("加密失败,key不能小于8位"); | 
|         } | 
|         if (data == null) | 
|             return null; | 
|         try { | 
|             Key secretKey = generateKey(password); | 
|             Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); | 
|             IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); | 
|             cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); | 
|             byte[] bytes = cipher.doFinal(data.getBytes(CHARSET)); | 
|   | 
|             //JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder | 
|             //Android平台可以使用android.util.Base64 | 
|             return new String(Base64.getEncoder().encode(bytes)); | 
|   | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|             return data; | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * DES解密字符串 | 
|      * | 
|      * @param password 解密密码,长度不能够小于8位 | 
|      * @param data 待解密字符串 | 
|      * @return 解密后内容 | 
|      */ | 
|     public static String decrypt(String password, String data) { | 
|         if (password== null || password.length() < 8) { | 
|             throw new RuntimeException("加密失败,key不能小于8位"); | 
|         } | 
|         if (data == null) | 
|             return null; | 
|         try { | 
|             Key secretKey = generateKey(password); | 
|             Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); | 
|             IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); | 
|             cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); | 
|             return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET); | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|             return null; | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * DES加密文件 | 
|      * | 
|      * @param srcFile  待加密的文件 | 
|      * @param destFile 加密后存放的文件路径 | 
|      * @return 加密后的文件路径 | 
|      */ | 
|     public static String encryptFile(String password, String srcFile, String destFile) { | 
|   | 
|         if (password== null || password.length() < 8) { | 
|             throw new RuntimeException("加密失败,key不能小于8位"); | 
|         } | 
|         try { | 
|             IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); | 
|             Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); | 
|             cipher.init(Cipher.ENCRYPT_MODE, generateKey(password), iv); | 
|             InputStream is = new FileInputStream(srcFile); | 
|             OutputStream out = new FileOutputStream(destFile); | 
|             CipherInputStream cis = new CipherInputStream(is, cipher); | 
|             byte[] buffer = new byte[1024]; | 
|             int r; | 
|             while ((r = cis.read(buffer)) > 0) { | 
|                 out.write(buffer, 0, r); | 
|             } | 
|             cis.close(); | 
|             is.close(); | 
|             out.close(); | 
|             return destFile; | 
|         } catch (Exception ex) { | 
|             ex.printStackTrace(); | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     /** | 
|      * DES解密文件 | 
|      * | 
|      * @param srcFile  已加密的文件 | 
|      * @param destFile 解密后存放的文件路径 | 
|      * @return 解密后的文件路径 | 
|      */ | 
|     public static String decryptFile(String password, String srcFile, String destFile) { | 
|         if (password== null || password.length() < 8) { | 
|             throw new RuntimeException("加密失败,key不能小于8位"); | 
|         } | 
|         try { | 
|             File file = new File(destFile); | 
|             if (!file.exists()) { | 
|                 file.getParentFile().mkdirs(); | 
|                 file.createNewFile(); | 
|             } | 
|             IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); | 
|             Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); | 
|             cipher.init(Cipher.DECRYPT_MODE, generateKey(password), iv); | 
|             InputStream is = new FileInputStream(srcFile); | 
|             OutputStream out = new FileOutputStream(destFile); | 
|             CipherOutputStream cos = new CipherOutputStream(out, cipher); | 
|             byte[] buffer = new byte[1024]; | 
|             int r; | 
|             while ((r = is.read(buffer)) >= 0) { | 
|                 cos.write(buffer, 0, r); | 
|             } | 
|             cos.close(); | 
|             is.close(); | 
|             out.close(); | 
|             return destFile; | 
|         } catch (Exception ex) { | 
|             ex.printStackTrace(); | 
|         } | 
|         return null; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 海康加密 | 
|      * @param userName | 
|      * @param hour | 
|      * @return | 
|      */ | 
|     public static  String generateTokenToHk(String userName,Integer hour, RedisTemplate<String,Object> redisTemplate){ | 
|          long currentTimeMillis = System.currentTimeMillis() + 1000*60*60*hour; | 
|          String encrypt = DESUtil.encrypt("12345678",currentTimeMillis + "_" + userName ); | 
|          redisTemplate.opsForValue().set(Constants.REDIS_HK_TOKEN_KEY+encrypt, encrypt,1000*60*60*hour, TimeUnit.MILLISECONDS); | 
|          return encrypt; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 海康解码 | 
|      * @param token | 
|      * @return | 
|      */ | 
|     public static String verifyHkToken(String token){ | 
|         String decrypt = DESUtil.decrypt("12345678",token); | 
|         if(StringUtils.isBlank(decrypt)){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"token解析失败"); | 
|         } | 
|         try{ | 
|             Integer index_ = decrypt.indexOf("_"); | 
|             long currentTimeMillis = Long.valueOf(decrypt.substring(Constants.ZERO,index_)); | 
|             if(currentTimeMillis<=System.currentTimeMillis()){ | 
|                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"token已过期"); | 
|             } | 
|             String userName = decrypt.substring(index_+Constants.ONE); | 
|             return userName ; | 
|         }catch (Exception e){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"token解析失败"); | 
|         } | 
|   | 
|     } | 
|   | 
|   | 
|   | 
|   | 
| } |