package org.springblade.common.utils.encryption;
//
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.BCUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;


/**
 * @author 黑子
 * SM2加解密
 */
public class Sm2Util {

    static SM2 sm2 = SmUtil.sm2();
    /**
     * 获取公钥
     * @return
     */
    public static String getPublicKey(){
       return  HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));
    }

    /**
     * 获取私钥
     * @return
     */
    public static String getPrivateKey(){
        return  HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));
    }

//    public static void main(String[] args) {
//            String privateKey = getPrivateKey();
//            String publicKey = getPublicKey();
//            String msg= encrypt(publicKey,"1234567890");
////            String msg2= decrypt(privateKey,msg);
//            System.err.println(msg);
////            System.err.println(msg2);
//    }
    /**
     * 加密
     *公钥加密
     * @param publicKey 公钥
     * @param data 明文
     * @return 密文
     */
    public static String encrypt(String publicKey, String data) {
        return SmUtil.sm2(null, publicKey)
                .encryptHex(data.getBytes(), KeyType.PublicKey)
                // 加密后，密文前面会有04，需要去掉
                .substring(2);
    }
    /**
     * 解密
     * 私钥解密
     * @param privateKey 私钥
     * @param data 密文
     * @return 明文
     */
    public static String decrypt(String privateKey, String data) {
        // 前端加密是没有04的，所以解析的时候要加04
        data = "04" + data;
        return SmUtil.sm2(privateKey, null)
                .decryptStr(data, KeyType.PrivateKey);
    }
}
