package io.hmit.common.utils.sm;

import io.hmit.common.utils.sm.sm2.SM2Utils;
import io.hmit.common.utils.sm.sm4.SM4Utils;

/**
 * <h1>国标商密 SM4 + SM2</h1>
 *
 * 使用说明：
 * 本工具类对加密结果、加密密钥进行解密后返回原始值。
 *
 * 前端：
 * 1. 对需要加密的 原始文本 采用 SM4 对称加密并生成 SM4 密钥 和 SM4 加密文本
 * 2. 对 SM4 密钥 采用 SM2 加密，使用 SM2 生成的公钥加密并生成 SM2 加密文本
 * 3. 将 SM4 加密文本 和 SM2 加密文本返回后端
 *
 * 后端
 * 1. 接收两端加密文本
 * 2. 对 SM2 加密文本使用本地密钥进行加密，获得被加密的 SM4 密钥
 * 3. 使用 SM4 密钥对 SM4 加密文本进行解密，最终获得被加密的 原始文本
 *
 * @author Shen && syf0412@vip.qq.com
 * @since 2022/9/22 9:50
 */
public class SMUtil {

    public static final String SM4_KEY = "Hpm8hpBIYd1EnC+A";
    public static final String SM2_PRIVATE_KEY_HEX = "1946c9950c06b773a232abc866deaa920d0862fe1fdce3ea6ce963222068d3eb";
    public static final String SM2_PUBLIC_KEY_HEX = "047b11abb349f69cc6bb099446aedf1faee1114fbcb5ad49493c39b12296e7ceb3919b3dfc3833af6383c7aa35bb01409641611e1ed894cd28e46984bb97bbc5a0c96a3ccbb9a2c939b1b005d2a51c9346e1b5a903cd61dac624784c6e8d19e5c4fcee348c3a45a2b04cbf8b47cc54e564";

    /**
     * <h2>对文本进行 SM2 解密</h2>
     * @param encryptData 加密文本
     * @return 解密文本
     */
    public static String SM2Decrypt(String encryptData) {
        return SM2Utils.decrypt(SM2_PRIVATE_KEY_HEX, encryptData);
    }

    /**
     * <h2>对文本进行 SM2 加密</h2>
     * @param plainText 原始文本
     * @return 加密文本
     */
    public static String SM2Encrypt(String plainText) {
        return SM2Utils.encrypt(SM2_PUBLIC_KEY_HEX, plainText);
    }

    /**
     * <h2>对文本进行 SM4 解密，默认密钥</h2>
     * @param encryptData 加密文本
     * @return 解密文本
     */
    public static String SM4Decrypt(String encryptData) {
        return SM4Utils.decryptData_ECB(encryptData, SM4_KEY);
    }

    /**
     * <h2>对文本进行 SM4 加密，默认密钥</h2>
     * @param plainText 被加密文本
     * @return 加密文本
     */
    public static String SM4Encrypt(String plainText) {
        return SM4Utils.encryptData_ECB(plainText, SM4_KEY);
    }

    /**
     * <h2>对文本进行 SM4 解密，自定义密钥</h2>
     * @param encryptData 加密文本
     * @param sk 密钥
     * @return 解密文本
     */
    public static String SM4Decrypt(String encryptData, String sk) {
        return SM4Utils.decryptData_ECB(encryptData, sk);
    }

    /**
     * <h2>对文本进行 SM4 加密，自定义密钥</h2>
     * @param plainText 被加密文本
     * @param sk 密钥
     * @return 加密文本
     */
    public static String SM4Encrypt(String plainText, String sk) {
        return SM4Utils.encryptData_ECB(plainText, sk);
    }

    public static String SMDecryptSM2AndSM4(String encryptSM4Key, String encryptSM4Text) {
        if (!encryptSM4Key.startsWith("04")) {
            encryptSM4Key = "04" + encryptSM4Key;
        }
        return SM4Decrypt(encryptSM4Text, SM2Decrypt(encryptSM4Key));
    }

}
