后端相关代码
- 引入依赖
<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>
- 生成密钥
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);
- 加密方法
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());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;}
- 解密方法
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));}
前端相关代码
- 引入依赖
pnpm i sm-crypto
- 加密
const pubKey = '04..' const encryptData = (data) => {const encryptedData = sm2.doEncrypt(data, pubKey, 1)return ‘04’ + encryptedData
}const data = {id: '123456',username: 'text',timestamp: Date.now()}
const encryptedData = encryptData(JSON.stringify(data))
console.log('加密后的数据(传给后端):', encryptedData)