依赖 bcprov-jdk15on-1.62.jar或bcprov-jdk15on-1.64.jar,其他版本没看过
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.engines.SM2Engine.Mode;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithID;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.SM2Signer;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.math.ec.ECConstants;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.math.ec.ECCurve.Fp;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.bouncycastle.util.test.TestRandomBigInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SM2
{
static
{
if (Security.getProvider("BC") == null) {
Security.addProvider(new BouncyCastleProvider());
}
}
public static enum EncodeMode
{
C1C3C2, C1C2C3;
private EncodeMode() {
}
}
private static final Logger logger = LoggerFactory.getLogger(SM2.class);
private SM2Engine engine;
private SM2Signer signer;
private SM2Engine.Mode mode = SM2Engine.Mode.C1C3C2;
private ECPublicKeyParameters publicKeyParams;
private ECPrivateKeyParameters privateKeyParams;
private SM2Param ecParam;
private boolean isTest = false;
public SM2(byte[] publicKey, byte[] privateKey)
{
init(publicKey, privateKey);
}
public SM2(String publicKey, String privateKey)
{
this(ToolsUtil.decode(publicKey), ToolsUtil.decode(privateKey));
}
public void init(byte[] publicKey, byte[] privateKey)
{
this.ecParam = new SM2Param(this.isTest);
if ((null != publicKey) && (null == this.publicKeyParams)) {
this.publicKeyParams = new ECPublicKeyParameters(this.ecParam.ecc_curve.decodePoint(publicKey), this.ecParam.ecc_bc_spec);
}
if ((null != privateKey) && (null == this.privateKeyParams)) {
this.privateKeyParams = new ECPrivateKeyParameters(new BigInteger(1, privateKey), this.ecParam.ecc_bc_spec);
}
}
public void setMode(EncodeMode mode)
{
switch (1.$SwitchMap$com$pab$sm$SM2$EncodeMode[mode.ordinal()])
{
case 1:
this.mode = SM2Engine.Mode.C1C2C3;
break;
case 2:
this.mode = SM2Engine.Mode.C1C3C2;
}
}
private SM2Engine getEnginer()
{
if (null == this.engine) {
this.engine = new SM2Engine(this.mode);
}
return this.engine;
}
private SM2Signer getSigner()
{
if (null == this.signer) {
this.</