All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.nxyfan.framework.common.util.CommonCryptogramUtil Maven / Gradle / Ivy

package com.nxyfan.framework.common.util;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SymmetricCrypto;

/**
 * 加密工具类,本框架目前使用 https://github.com/antherd/sm-crypto 项目中一些加解密方式
 * 使用小伙伴需要过等保密评相关,请在此处更改为自己的加密方法,或加密机,使用加密机同时需要替换公钥,私钥在内部无法导出,提供加密的方法
 * 如果不涉及到加密机方面的内容,请更改公私要为自己重新生成的,生成方式请看集成的sm-crypto主页
 *
 * @author yubaoshan
 * @date 2022/9/15 21:51
 */
public class CommonCryptogramUtil {

    /** 公钥 */
    private static String PUBLIC_KEY = "04298364ec840088475eae92a591e01284d1abefcda348b47eb324bb521bb03b0b2a5bc393f6b71dabb8f15c99a0050818b56b23f31743b93df9cf8948f15ddb54";

    /** 私钥 */
    private static String PRIVATE_KEY = "3037723d47292171677ec8bd7dc9af696c7472bc5f251b2cec07e65fdef22e25";

    /** SM4的对称秘钥(生产环境需要改成自己使用的) 16 进制字符串,要求为 128 比特 */
    private static String KEY = "6gsx@654hs68456!";

    /**
     * 加密方法(Sm2 的专门针对前后端分离,非对称秘钥对的方式,暴露出去的公钥,对传输过程中的密码加个密)
     *
     * @author yubaoshan
     * @date 2022/9/15 21:51
     * @param str 待加密数据
     * @return 加密后的密文
     */
    public static String doSm2Encrypt(String str) {
    	SM2 sm2 = SmUtil.sm2(PRIVATE_KEY, PUBLIC_KEY);
        return sm2.encryptHex(str, KeyType.PublicKey);
    }

    /**
     * 
     * Describe: Sm2使用公钥加密
     * Author: Administrator  
     * Create Time: 2024年4月21日 上午1:52:08   
     * @param str        待加密数据
     * @param publicKey  公钥
     * @param privateKey 私钥
     * @return 加密后的密文
     */
    public static String doSm2Encrypt(String str, String publicKey, String privateKey) {
    	SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
        return sm2.encryptHex(str, KeyType.PublicKey);
    }
    
    /**
     * 解密方法
     * 如果采用加密机的方法,用try catch 捕捉异常,返回原文值即可
     *
     * @author yubaoshan
     * @date 2022/9/15 21:51
     * @param str 密文
     * @return 解密后的明文
     */
    public static String doSm2Decrypt(String str) {
        // 解密
    	SM2 sm2 = SmUtil.sm2(PRIVATE_KEY, PUBLIC_KEY);
    	if(!str.startsWith("04")) {
    		str = "04" + str;
        }
    	return sm2.decryptStr(str, KeyType.PrivateKey);
    }

    /**
     * 
     * Describe: Sm2使用私钥解密
     * Author: Administrator  
     * Create Time: 2024年4月21日 上午1:53:09   
     * @param str        待解密数据
     * @param publicKey  公钥
     * @param privateKey 私钥
     * @return 解密后的明文
     */
    public static String doSm2Decrypt(String str, String publicKey, String privateKey) {
    	SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
    	if(!str.startsWith("04")) {
    		str = "04" + str;
        }
    	return sm2.decryptStr(str, KeyType.PrivateKey);
    }

    /**
     * 加密方法
     *
     * @author yubaoshan
     * @date 2022/9/15 21:51
     * @param str 待加密数据
     * @return 加密后的密文
     */
    public static String doSm4CbcEncrypt(String str) {
        try {
			SymmetricCrypto sm4 = SmUtil.sm4(KEY.getBytes());
			return sm4.encryptHex(str);
		}catch (Exception e) {
			e.printStackTrace();
			return str;
		}
    }

    /**
     * 解密方法
     * 如果采用加密机的方法,用try catch 捕捉异常,返回原文值即可
     *
     * @author yubaoshan
     * @date 2022/9/15 21:51
     * @param str 密文
     * @return 解密后的明文
     */
    public static String doSm4CbcDecrypt(String str) {
    	try {
			SymmetricCrypto sm4 = SmUtil.sm4(KEY.getBytes());
			return sm4.decryptStr(str, CharsetUtil.CHARSET_UTF_8);
		}catch(Exception e) {
			e.printStackTrace();
			return str;
		}
    }

    /**
     * 纯签名
     *
     * @author yubaoshan
     * @date 2022/9/15 21:51
     * @param str 待签名数据
     * @return 签名结果
     */
    public static String doSignature(String str) {
        SM2 sm2 = SmUtil.sm2(PRIVATE_KEY, PUBLIC_KEY);
        // 加签
        return sm2.signHex(HexUtil.encodeHexStr(str));
        
        
    }

    /**
     * 验证签名结果
     *
     * @author yubaoshan
     * @date 2022/9/15 21:51
     * @param originalStr 签名原文数据
     * @param str 签名结果
     * @return 是否通过
     */
    public static boolean doVerifySignature(String originalStr, String str) {
        SM2 sm2 = SmUtil.sm2(PRIVATE_KEY, PUBLIC_KEY);
        //	验签
        return sm2.verifyHex(HexUtil.encodeHexStr(str), originalStr);
    }

    /**
     * 通过杂凑算法取得hash值,用于做数据完整性保护
     *
     * @author yubaoshan
     * @date 2022/9/15 21:51
     * @param str 字符串
     * @return hash 值
     */
    public static String doHashValue(String str) {
        return SmUtil.sm3(str);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy