package com.cusc.nirvana.user.rnr.fp.util;

import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

/**
 * Description: AES加密算法
 * <br />
 * CreateDate 2021-11-04 09:14:32
 *
 * @author yuyi
 **/
public class RnrDataAesUtil {

    private final static Logger LOGGER = LoggerFactory.getLogger(RnrDataAesUtil.class);

    private static final String ALGORITHM = "AES";
    //private static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding";
    private static final String AES_ECB_PADDING = "AES/ECB/PKCS5Padding";

    /**
     * Aes加密(ECB工作模式),不要IV
     *
     * @param key  密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数
     * @param data 明文
     * @return 密文
     * @throws Exception
     */
    public static byte[] encodeByECB(byte[] key, byte[] data) throws Exception {
        //获取SecretKey对象,也可以使用getSecretKey()方法
        SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);
        //获取指定转换的密码对象Cipher（参数：算法/工作模式/填充模式）
        Cipher cipher = Cipher.getInstance(AES_ECB_PADDING);
        //用密钥和一组算法参数规范初始化此Cipher对象（加密模式）
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        //执行加密操作
        return cipher.doFinal(data);
    }

    /**
     * Aes加密(ECB工作模式),不要IV
     *
     * @param key  密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数
     * @param data 明文
     * @return 密文
     * @throws Exception
     */
    public static byte[] encodeByECB(String key, byte[] data) throws Exception {
        return encodeByECB(key.getBytes(StandardCharsets.UTF_8), data);
    }

    /**
     * Aes加密(ECB工作模式),不要IV
     *
     * @param key  密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数
     * @param data 明文
     * @return 密文
     * @throws Exception
     */
    public static String encodeByECB(String key, String data) throws Exception {
        return ByteUtils.toHexString(encodeByECB(key.getBytes(StandardCharsets.UTF_8), data.getBytes(StandardCharsets.UTF_8)));
    }

    /**
     * Aes解密(ECB工作模式),不要IV
     *
     * @param key  密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数
     * @param data 密文
     * @return 明文
     * @throws Exception
     */
    public static byte[] decodeByECB(byte[] key, byte[] data) throws Exception {
        //获取SecretKey对象,也可以使用getSecretKey()方法
        SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);
        //获取指定转换的密码对象Cipher（参数：算法/工作模式/填充模式）
        Cipher cipher = Cipher.getInstance(AES_ECB_PADDING);
        //用密钥和一组算法参数规范初始化此Cipher对象（加密模式）
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        //执行加密操作
        return cipher.doFinal(data);
    }

    /**
     * Aes解密(ECB工作模式),不要IV
     *
     * @param key  密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数
     * @param data 密文
     * @return 明文
     * @throws Exception
     */
    public static byte[] decodeByECB(String key, byte[] data) throws Exception {
        return decodeByECB(key.getBytes(StandardCharsets.UTF_8), data);
    }

    /**
     * Aes解密(ECB工作模式),不要IV
     *
     * @param key  密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数
     * @param data 密文
     * @return 明文
     * @throws Exception
     */
    public static String decodeByECB(String key, String data) throws Exception {
        return new String(decodeByECB(key.getBytes(StandardCharsets.UTF_8),
                ByteUtils.fromHexString(data)), StandardCharsets.UTF_8);
    }

    public static void main(String[] args) throws Exception {
        String aesKey = Md5CaculateUtil.MD5("clw@LT#1079");
        System.out.println(encodeByECB(aesKey, "042e18fb003a4c7dbccf60758b58e55c"));
        //ccEyCOMijZZqGOi2zYTRSb1ml8gTEZ4z8msGFYnyk+C0teZECA==
        //System.out.println(decodeByECB("rnF2auSElnrgw/3Xxvb78F/91Fq7pyUzSOgPJUikWAH6gcojOw==",
        //        "042e18fb003a4c7dbccf60758b58e55c"));
    }
}
