前后端实现sm2加密
后端相关代码
- 引入依赖
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>
- 生成密钥
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);
- 加密方法
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;
}
- 解密方法
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));
}
前端相关代码
- 引入依赖
bash
pnpm i sm-crypto
- 加密
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)