Java SM2 签名验签 - 使用 Bouncy Castle 库实现
Java 中的 SM2 签名验签需要使用 Bouncy Castle 库中的 SM2 算法实现。以下是一个简单的示例代码:
签名:
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.engines.SM2Engine;
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.signers.SM2Signer;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.math.ec.ECPoint;
import java.security.Security;
import java.util.Base64;
public class SM2Utils {
/**
* 生成 SM2 密钥对
*
* @return 密钥对
*/
public static AsymmetricCipherKeyPair generateKeyPair() {
Security.addProvider(new BouncyCastleProvider());
ECKeyPairGenerator gen = new ECKeyPairGenerator();
ECDomainParameters ecSpec = ECDomainParametersUtil.getSM2Parameters();
ECKeyGenerationParameters keygenParams = new ECKeyGenerationParameters(ecSpec, null);
gen.init(keygenParams);
return gen.generateKeyPair();
}
/**
* SM2 签名
*
* @param data 待签名数据
* @param privateKey 私钥
* @return 签名结果
*/
public static String sign(byte[] data, ECPrivateKeyParameters privateKey) {
SM2Signer signer = new SM2Signer();
CipherParameters param = new SM2Signer.Parameters(privateKey.getParameters());
signer.init(true, param);
signer.update(data, 0, data.length);
byte[] signature = signer.generateSignature();
return Base64.getEncoder().encodeToString(signature);
}
}
验签:
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.signers.SM2Signer;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.math.ec.ECPoint;
import java.security.Security;
import java.util.Base64;
public class SM2Utils {
/**
* SM2 验签
*
* @param data 待验签数据
* @param sign 签名结果
* @param publicKey 公钥
* @return 验签结果
*/
public static boolean verify(byte[] data, byte[] sign, ECPublicKeyParameters publicKey) {
SM2Signer signer = new SM2Signer();
CipherParameters param = new SM2Signer.Parameters(publicKey.getParameters());
signer.init(false, param);
signer.update(data, 0, data.length);
return signer.verifySignature(sign);
}
}
使用示例:
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import java.util.Base64;
public class Main {
public static void main(String[] args) {
// 生成密钥对
AsymmetricCipherKeyPair keyPair = SM2Utils.generateKeyPair();
ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) keyPair.getPrivate();
ECPublicKeyParameters publicKey = (ECPublicKeyParameters) keyPair.getPublic();
// 待签名数据
byte[] data = 'Hello, world!'.getBytes();
// 签名
String sign = SM2Utils.sign(data, privateKey);
System.out.println('签名结果:' + sign);
// 验签
boolean verifyResult = SM2Utils.verify(data, Base64.getDecoder().decode(sign), publicKey);
System.out.println('验签结果:' + verifyResult);
}
}
原文地址: https://www.cveoy.top/t/topic/mV7y 著作权归作者所有。请勿转载和采集!