Java使用Sm2国密算法对数据参数加密
一、业务场景
项目中有一个需求是需要调用第三方接口传递相关数据,现需要对传输的数据使用sm2算法进行加密后再传递。
二、实现过程
此前找过很多资料,但是都是需要写不少代码才能实现对数据的加密解密,而且加密解密只能使用自己生成的公钥和私钥完成,并不适合在调用第三方接口的场景(使用对方提供的公钥)。此次是通过hutool工具包的sm2国密算法工具类来实现的
maven 依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.69</version>
</dependency>
加密代码
public static String encrpty(String publicKey,String content){
System.out.println("接收到的publicKey===="+publicKey);
System.out.println("接收到的报文===="+content);
ECPublicKeyParameters ecPublicKeyParameters = null;
//这里需要根据公钥的长度进行加工
if (publicKey.length() == 130) {
//这里需要去掉开始第一个字节 第一个字节表示标记
publicKey = publicKey.substring(2);
String xhex = publicKey.substring(0, 64);
String yhex = publicKey.substring(64, 128);
ecPublicKeyParameters = BCUtil.toSm2Params(xhex, yhex);
} else {
PublicKey p = BCUtil.decodeECPoint(publicKey, SmUtil.SM2_CURVE_NAME);
ecPublicKeyParameters = BCUtil.toParams(p);
}
//创建sm2 对象
SM2 sm2 = new SM2(null, ecPublicKeyParameters);
// 公钥加密
return sm2.encryptBcd(content, KeyType.PublicKey).toLowerCase();
}