package com.demo.util;

import org.springframework.util.StringUtils;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;
import java.util.Date;
import java.util.Random;

public class SecretUtil {

    public static final String KEY_ALGORITHM = "AES";


    /**
     * 生成AES密钥
     *
     * @param length 长度
     * @param password 密钥种子(指定的字符串 ---/ 可以为空 /  ---)
     * @return
     * @throws Exception
     */
    public static String generateAesKey(int length, String password) throws Exception {
        //实例化
        KeyGenerator kgen = null;
        kgen = KeyGenerator.getInstance(KEY_ALGORITHM);
        //设置密钥长度
        if(StringUtils.isEmpty(password)){
            kgen.init(length);
        }else{
            //SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以生成的秘钥就一样。
            kgen.init(length, new SecureRandom(password.getBytes()));
        }

        //生成密钥
        SecretKey skey = kgen.generateKey();
        //返回密钥的二进制编码
        byte[] skeyByte = skey.getEncoded();
        return byteToHexString(skeyByte);
    }

    /**
     * byte数组转化为16进制字符串
     * @param bytes
     * @return
     */
    public static String byteToHexString(byte[] bytes){
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            String strHex=Integer.toHexString(bytes[i]);
            if(strHex.length() > 3){
                sb.append(strHex.substring(6));
            } else {
                if(strHex.length() < 2){
                    sb.append("0" + strHex);
                } else {
                    sb.append(strHex);
                }
            }
        }
        return  sb.toString();
    }

    /**
     * 生成随机的子节数
     * @param len
     * @return
     */
    public static String getRandNum(int len) {
        StringBuffer flag = new StringBuffer();
        String sources = new Date().getTime() +""; // 加上一些字母,就可以生成pc站的验证码了
        Random rand = new Random();
        for (int j = 0; j < len; j++) {
            flag.append(sources.charAt(rand.nextInt(9)) + "");
        }
        return  flag.toString();

    }


//    public static void main(String args[]) throws Exception{
//
////        System.out.println( getRandNum(6));
//        System.out.println(generateAesKey(128,"reyun"));
//
//    }


}