解密工具类

package com.linkage.util;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;


/**
 *  解密工具类
 *  将AppKey转换为byte[]
 *   将Token转换为向量IV
 *  使用3des解密,运算模式CBC,填充模式PKCS7。获得解密后是byte[],使用utf8编码格式转换为字符串
 */
public final class SecurityDESUtil {
    private static final String SECRET_KEY = "DESede";
    //3des解密,运算模式CBC,填充模式PKCS7
    private static final String CIPHER = "DESede/CBC/PKCS5Padding";
    private static final Charset CHARSET = Charset.forName("UTF-8");
    private static final Logger logger = LoggerFactory.getLogger(SecurityDESUtil.class);
    private static  Cipher cipher = null;
    private static  SecretKey key = null;

    static  {
        try {
            synchronized(SecurityDESUtil.class){
                byte[] tmpKey = getAppKey();
                key = new SecretKeySpec(tmpKey, SECRET_KEY);
                cipher = Cipher.getInstance(CIPHER);
            }


        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }


    }


    private static byte[] getAppKey() {
       final byte[] appKey = parseHexStr2Byte(ConfigUtil.getAppKey());
       final byte[] tmpkey ={ 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 };
        for (int ii = 0; ii < tmpkey.length; ii++)
        {
            tmpkey[ii] = appKey[ii];
        }
        return tmpkey;
    }


    /**
     * 加密
     * @param iv
     * @param content
     * @return
     */
    public synchronized static String encrypt(String iv, String content){
        try {
            logger.info("encrypt:"+content);
            final byte[] tmpiv = getIv(iv);
            final byte[] contentBytes = content.getBytes(CHARSET);
            final  IvParameterSpec ivParameterSpec = new IvParameterSpec(tmpiv);
            cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);
            final byte[] bytes = cipher.doFinal(contentBytes);
            return Base64.encodeBase64String(bytes);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }


    private static byte[] getIv(String iv) {
        final  byte[] byteIv = parseHexStr2Byte(iv);
        byte[] tmpiv ={ 0, 1, 2, 3, 4, 5, 6, 7 };
        for (int i = 0; i < tmpiv.length; i++)
        {
            tmpiv[i] = byteIv[i];
        }
        return tmpiv;
    }


    /**
     * 解密
     * @param iv
     * @param content
     * @return
     */
    public synchronized static String decrypt(String iv, String content){
        try {
            logger.info("decrypt:"+content);
            final byte[] byteIv = getIv(iv);
            final IvParameterSpec ivParameterSpec = new IvParameterSpec(byteIv);
            // CBC requires an initialization vector
            cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
            final byte[] decoderStr = Base64.decodeBase64(content);
            final byte[] bytes = cipher.doFinal(decoderStr,0,decoderStr.length);
            return new String(bytes,CHARSET);
        } catch (Exception e) {
            e.printStackTrace();
           return null;
        }


    }


    /**
     * 将二进制转换成16进制
     * @param buf
     * @return  String
     */
    public synchronized static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }
    /**
     * 将16进制转换为二进制
     * @param hexStr
     * @return  byte[]
     */
    public synchronized static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length()/2];
        for (int i = 0;i< hexStr.length()/2; i++) {
            int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
            int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }




}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值