问题描述
在maven项目中引入新的第三方组件时,组件中的依赖可能会与项目已有组件依赖的jar包(其他组件)发生冲突。
比如引入的bcprov-jdk15on 是1.68,无法覆盖旧版本1.51,导致冲突。
解决方案
使用maven-shade将bcprov-jdk15on -1.68重新打包,mvn install再引入
-
新建空项目,编辑pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tt</groupId>
<artifactId>shade-test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<!--排除文件-->
<exclude>META-INF/*.SF</exclude>
</excludes>
</filter>
</filters>
<relocations>
<relocation>
<!--原路径-->
<pattern>org.bouncycastle</pattern>
<!--替换路径-->
<shadedPattern>shade.org.bouncycastle</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 编写加密工具类
package com.tt;
import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.util.BigIntegers;
import org.bouncycastle.util.encoders.Hex;
import java.math.BigInteger;
public class Sm2TtUtil {
/**
* SM2加密算法
*
* @param publicKey 公钥
* @param data 数据
* @return
*/
public static String encrypt(String publicKey, String data) {
X9ECParameters x9ECParameters = GMNamedCurves.getByName("sm2p256v1");
ECDomainParameters domainParameters = new ECDomainParameters(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN(), x9ECParameters.getH());
ECCurve curve = domainParameters.getCurve();
byte[] pointEncoded = Hex.decode(publicKey);
ECPoint point = curve.decodePoint(pointEncoded);
ECPublicKeyParameters ecPublicKeyParameters = new ECPublicKeyParameters(point, domainParameters);
CipherParameters pubKeyParameters = new ParametersWithRandom(ecPublicKeyParameters, null);
SM2Engine engine = new SM2Engine(new SM3Digest(),SM2Engine.Mode.C1C3C2);
engine.init(true, pubKeyParameters);
byte[] bytes = data.getBytes();
byte[] dest = new byte[0];
try {
dest = engine.processBlock(bytes, 0, bytes.length);
} catch (InvalidCipherTextException e) {
e.printStackTrace();
}
return Hex.toHexString(dest);
}
/**
* SM2解密算法
*
* @param privateKey 私钥
* @param cipherData 密文数据
* @return
*/
public static String decrypt(String privateKey, String cipherData) {
byte[] cipherDataByte = Hex.decode(cipherData);
//获取一条SM2曲线参数
X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
//构造domain参数
ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(),
sm2ECParameters.getG(), sm2ECParameters.getN());
byte[] decode = Hex.decode(privateKey);
BigInteger bigInteger = BigIntegers.fromUnsignedByteArray(decode);
ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(bigInteger, domainParameters);
SM2Engine sm2Engine = new SM2Engine(new SM3Digest(),SM2Engine.Mode.C1C3C2);
sm2Engine.init(false, privateKeyParameters);
String result = null;
try {
byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);
return new String(arrayOfBytes);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String staticPublicKey = "0408fda0c0f6d1e51289cd5edcef7386a696e1a63659dd4ae3516cfd4d0a5dfaa341ff9c86f2572cae9e1406a036d43b71862e8acf0dbfaeb6216c775038b46d40";
public static String staticPrivateKey = "2158c2678f7ee7685392ddc31916b8c835a98887040bbf69f76fa4aa0acff42e";
public static void main(String[] args) {
String message = "HUSUADOI7OM4URCO";
//加密
String resultPublic = encrypt(staticPublicKey,message);
System.out.println("加密结果:" + resultPublic);
//解密
String resultPrivate = decrypt(staticPrivateKey,resultPublic);
System.out.println("解密结果:" + resultPrivate);
System.out.println("验证结果:"+message.equals(resultPrivate));
}
}
- 重新打包
- 对比结果
- 成功引用新包