前后端实现国密2加密

前后端实现sm2加密

后端相关代码

  1. 引入依赖
java 复制代码
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.32</version>
</dependency>
<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bcprov-jdk15on</artifactId>
	<version>1.70</version>
</dependency>
  1. 生成密钥
java 复制代码
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.SM2;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;


SM2 sm2 = SmUtil.sm2();
// 获取私钥
String privateKey = sm2.getPrivateKeyBase64();
// 获取公钥
String publicKey = sm2.getPublicKeyBase64();

System.out.println("私钥: " + privateKey);
System.out.println("公钥: " + publicKey);

// 给前端用的公钥
String publicKeyHex = HexUtil.encodeHexStr(((BCECPublicKey)sm2.getPublicKey()).getQ().getEncoded(false));
System.out.println("公钥Q: " + publicKeyHex);
  1. 加密方法
java 复制代码
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import com.alibaba.fastjson.JSONObject;

public static String encrypt() {
        JSONObject json = new JSONObject();
        json.put("id","123456");
        json.put("username","text");
        json.put("timestamp",System.currentTimeMillis());// 时间戳


        //加密 仅加密可不传私钥, publicKey为上一步获取的公钥
        SM2 sm21 = SmUtil.sm2(null, publicKey);
        String tyParam = sm21.encryptHex(json.toString(), KeyType.PublicKey);

        System.out.println("加密前内容 json:\t"+json.toString());
        System.out.println("加密后内容 tyParam:\t"+tyParam);
        return tyParam;
    }
  1. 解密方法
java 复制代码
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;

public static String decrypt(String text) {
        SM2 sm2 = SmUtil.sm2(PRIVATE_KEY_BASE64, null);
        return StrUtil.utf8Str(sm2.decryptFromBcd(text, KeyType.PrivateKey));
    }

前端相关代码

  1. 引入依赖
bash 复制代码
pnpm i sm-crypto
  1. 加密
javascript 复制代码
const pubKey = '04..' // 后端生成的publicKeyHex,必须是04开头

const encryptData = (data) => {
	const encryptedData = sm2.doEncrypt(data, pubKey, 1)
	// 传给后端密文需要添加04前缀
	return '04' + encryptedData
}

const data = {
    id: '123456',
    username: 'text',
    timestamp: Date.now()
  }
const encryptedData = encryptData(JSON.stringify(data))
console.log('加密后的数据(传给后端):', encryptedData)
相关推荐
雷神乐乐10 个月前
Java操作Excel导入导出——POI、Hutool、EasyExcel
java·开发语言·spring boot·poi·easyexcel·hutool
书晨00710 个月前
【BUG排查记】HttpUtil和SpringSecurity结合的坑
bug·springsecurity·hutool·httprequest
GGBondlctrl1 年前
【Spring】探秘 SpringBoot 配置文件:解锁验证码背后的实现逻辑
java·spring boot·验证码·hutool
Leslie_Lei1 年前
Hutool-Java工具库
java·hutool
小程序照片合成1 年前
vue引入sm-crypto通过sm4对文件进行加解密,用户输入密码
前端·javascript·vue·加解密·sm-crypto·sm4
ganjiee00071 年前
记录bug导致测试部署出错,但是本地环境启动正常。雪花算法使用中报错。并带有源码分析。
java·bug·hutool
戇居1 年前
Cache 缓存实现类简单使用
java·spring·缓存·hutool·lrucache·fifocache
HSJ01702 年前
使用hutool阿里云企业邮箱发送邮件和附件,包含PDF转图片base64,PDF转HTML
阿里云·hutool·邮件
胡斌附体2 年前
架构之第三方框架pinyin4j与hutool搭配使用原理
java·架构·maven·spi·hutool·pinyin4j