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);
}
}