package com.bonus.common.core.utils.encryption;

import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SM4;

/**
 * @author bonus
 */
public class Sm4Utils {
    /**
     * 必须是16字节
     */
    private static final String KEY = "78d1295afa99449b99d6f83820e6965c";

    private static final String IV = "f555adf6c01d0ab0761e626a2dae34a2";
    /**
     * 加密数据，使用固定盐
     *
     * @param plainText 明文，待加密的字符串
     * @return 加密后的密文（包含盐），Hex 编码格式，如果加密异常就返回传入的字符串
     */
    public static String encrypt(String plainText) {
        try {
            SM4 sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, HexUtil.decodeHex(KEY),HexUtil.decodeHex(IV));
            // 加密带盐的明文
            byte[] encryptedData = sm4.encrypt(plainText);
            // 返回带盐的加密结果（Hex编码）
            return HexUtil.encodeHexStr(encryptedData);
        } catch (Exception e) {
            return plainText; // 发生异常时返回传入字符串
        }
    }

    /**
     * 解密数据，使用固定盐
     *
     * @param cipherText 密文（包含盐），Hex 编码格式的字符串
     * @return 解密后的明文字符串，如果解密异常就返回传入的字符串
     */
    public static String decrypt(String cipherText) {
        try {
            // 初始化SM4解密工具
            SM4 sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, HexUtil.decodeHex(KEY),HexUtil.decodeHex(IV));
            // 解密数据
            byte[] decryptedData = sm4.decrypt(cipherText);
            return new String(decryptedData);
        } catch (Exception e) {
            return cipherText; // 发生异常时返回传入字符串
        }
    }

    // 测试方法，演示加密和解密过程
    public static void main(String[] args) {
        String plainText = "admin";
        System.out.println("原文: " + plainText);

        // 加密明文
        String encryptedText = Sm4Utils.encrypt(plainText);
        System.out.println("加密后: " + encryptedText);

        // 解密密文
        String decryptedText = Sm4Utils.decrypt(plainText);
        System.out.println("解密后: " + decryptedText);

        String sign = "jyy:2025-07-16";
        System.out.println("sign加密后: " + Sm4Utils.encrypt(sign));
    }
}
