package thyyxxk.webserver.utils;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import cn.hutool.core.codec.Base64;
import com.alibaba.fastjson.JSONObject;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class DesEncryption {

    public static void main(String[] args) {
        JSONObject a = new JSONObject();
        a.put("patNo", "0215415");
        a.put("times", 1);
        a.put("date", "2011-12-12 12:23:00");

        System.out.print("加密前");
        System.out.println(a);

        String jiami = DesEncryption.getEncryptString(a.toJSONString());
        String jiemi = DesEncryption.getDecryptString(jiami);

        // 53mbVtLVP4Lk08kgImqd4iP+HqaMwAyt0V5BTEHknipma/H7SI5NasTJGMrHUwXiBZwvewwj575wuYZVp3PvcQ==

        System.out.print("加密中");
        System.out.println(jiami);

        System.out.print("解密");
        System.out.println(jiemi);

        String salesman = "Mjc2NDc5ZTI4OTRmNDljNzgyNGIwZWVkZTI0ZmI0Y2QtMDE2NTAtMTcxMTY4MDQ2MDQwNQ==";
        String coupon = Base64.decodeStr(salesman);
        System.out.println("卡券解密");
        System.out.println(coupon);
    }

    private static Key key;

    private static String KEY_STR = "myKey";
    private static String CHARSETNAME = "UTF-8";
    private static String ALGORITHM = "DES";

    static {
        try {
            //生成DES算法对象
            KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
            //运用SHA1安全策略
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            //设置上密钥种子
            secureRandom.setSeed(KEY_STR.getBytes());
            //初始化基于SHA1的算法对象
            generator.init(secureRandom);
            //生成密钥对象
            key = generator.generateKey();
            generator = null;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /***
     * 获取加密的信息
     * @param str
     * @return
     */
    public static String getEncryptString(String str) {
        //基于BASE64编码，接收byte[]并转换成String
        BASE64Encoder encoder = new BASE64Encoder();
        try {
            //按utf8编码
            byte[] bytes = str.getBytes(CHARSETNAME);
            //获取加密对象
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            //初始化密码信息
            cipher.init(Cipher.ENCRYPT_MODE, key);
            //加密
            byte[] doFinal = cipher.doFinal(bytes);
            //byte[]to encode好的String 并返回
            return encoder.encode(doFinal);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /***
     * 获取解密之后的信息
     * @param str
     * @return
     */
    public static String getDecryptString(String str) {
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            //将字符串decode成byte[]
            byte[] bytes = decoder.decodeBuffer(str);
            //获取解密对象
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            //初始化解密信息
            cipher.init(Cipher.DECRYPT_MODE, key);
            //解密
            byte[] doFial = cipher.doFinal(bytes);

            return new String(doFial, CHARSETNAME);

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

}
