1.后端加密解密

1.1 依赖包

<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.54</version>
</dependency>

1.2 后端加密解密

public static void main(String[] args) throws Exception {
// 生成密钥对
generateKeyPair();

String plainText = "123";
byte[] sourceData = plainText.getBytes();

// 下面的秘钥可以使用generateKeyPair()生成的秘钥内容
// 国密规范正式私钥
String prik = "00D980117870CC52F5292E036D6BC78FF376B5C95B8AD0941A6FC851DA75B6E593";
// 国密规范正式公钥
String pubk = "03F9D45E97CA13EE0F2D57FB285ED9A5E99F4524BF6C851C7E460EAED9A29C57C9";

System.out.println("加密: ");
String cipherText = SM2Utils.encrypt(Util.hexToByte(pubk), sourceData);
System.out.println(cipherText);
cipherText="048393315e12462d0040b0b75cc032d5fd14ee3467eec447abdad26be165ad7459db40f2e26189f81359f4e91630be3d4a59edf5517d19fb0834bcc7a92107667282d5e5a0671241a6711be39a095aad7937195682b255af603796d225f8af25d4b01bbbbbda3ac719f7d6aa";
System.out.println("解密: ");
plainText = new String(SM2Utils.decrypt(Util.hexToByte(prik), Util.hexToByte(cipherText)));
System.out.println(plainText);

}

2.前端加密解密

2.1 前端依赖包

npm install --save sm-crypto

2.2 前端代码

获取密钥对

const sm2 = require('sm-crypto').sm2

let keypair = sm2.generateKeyPairHex()

publicKey = keypair.publicKey // 公钥
privateKey = keypair.privateKey // 私钥

// 默认生成公钥 130 位太长,可以压缩公钥到 66 位
const compressedPublicKey = sm2.compressPublicKeyHex(publicKey) // compressedPublicKey 和 publicKey 等价
sm2.comparePublicKeyHex(publicKey, compressedPublicKey) // 判断公钥是否等价

// 自定义随机数,参数会直接透传给 jsbn 库的 BigInteger 构造器
// 注意:开发者使用自定义随机数,需要自行确保传入的随机数符合密码学安全
let keypair2 = sm2.generateKeyPairHex('123123123123123')
let keypair3 = sm2.generateKeyPairHex(256, SecureRandom)

let verifyResult = sm2.verifyPublicKey(publicKey) // 验证公钥
verifyResult = sm2.verifyPublicKey(compressedPublicKey) // 验证公钥

加密解密

const sm2 = require('sm-crypto').sm2
const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1

let encryptData = sm2.doEncrypt(msgString, publicKey, cipherMode) // 加密结果
let decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode) // 解密结果

encryptData = sm2.doEncrypt(msgArray, publicKey, cipherMode) // 加密结果,输入数组
decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode, {output: 'array'}) // 解密结果,输出数组

备注

开头为04,没有则字符串拼接上