导包:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
SM2国密算法:
public class SM2Digest {
private static String SM2_CURVE_NAME = "sm2p256v1";
public static MessageDigest GETSM2ENCRYPTION() throws Exception {
BouncyCastleProvider provider = new BouncyCastleProvider();
ECGenParameterSpec genParameterSpec = new ECGenParameterSpec("sm2p256v1");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", provider);
keyPairGenerator.initialize(genParameterSpec, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
BCECPrivateKey privateKey = (BCECPrivateKey) keyPair.getPrivate();
BCECPublicKey publicKey = (BCECPublicKey) keyPair.getPublic();
System.out.println("privateKEY:" + privateKey);
System.out.println("Private Key: " + privateKey.getD().toString(16));
System.out.println("publicKey:" + publicKey);
System.out.println("Public Key: " + Hex.encode(publicKey.getQ().getEncoded(true)));
System.out.println("--------------------------生成现有公私钥-------------------------------------");
return null;
}
public static byte[] encryptPwd(String pwd, String X, String Y) {
byte[] r = null;
try {
byte[] data = pwd.getBytes();
SM2Digest sm2 = new SM2Digest();
ECDomainParameters domain = sm2.getDomain();
SM2Engine engine = sm2.getSM2Engine();
CipherParameters pubKeyParameters = sm2.getPubKey(X, Y, domain);
engine.init(true, pubKeyParameters);
r = engine.processBlock(data, 0, data.length);
} catch (Exception e) {
}
return r;
}
public static CipherParameters getPrvKey(String prvKey, ECDomainParameters domain) {
BigInteger prvKeyData = BigIntegers.fromUnsignedByteArray(Hex.decode(prvKey));
ECPrivateKeyParameters PrivateKey = new ECPrivateKeyParameters(prvKeyData, domain);
return PrivateKey;
}
public static CipherParameters getPubKey(String x, String y, ECDomainParameters domain) {
ECCurve curve = domain.getCurve();
ECPoint point = curve.createPoint(BigIntegers.fromUnsignedByteArray(Hex.decode(x)), BigIntegers.fromUnsignedByteArray(Hex.decode(y)));
ECPublicKeyParameters PublicKey = new ECPublicKeyParameters(point, domain);
CipherParameters pubKeyParameters = new ParametersWithRandom(PublicKey);
return pubKeyParameters;
}
public SM2Engine getSM2Engine() {
Digest digest = new SM3Digest();
SM2Engine engine = new SM2Engine(digest, SM2Engine.Mode.C1C3C2);
return engine;
}
public ECDomainParameters getDomain() {
X9ECParameters x9ECParameters = GMNamedCurves.getByName(SM2_CURVE_NAME);
ECDomainParameters domain = new ECDomainParameters(
x9ECParameters.getCurve(),
x9ECParameters.getG(),
x9ECParameters.getN(),
x9ECParameters.getH()
);
return domain;
}