java sm2 加密 解密

1 篇文章 0 订阅

java sm2 加密 解密

maven依赖

 <dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bcprov-jdk15on</artifactId>
	<version>1.57</version>
</dependency>

key 实体

public class SM2KeyPair {

    public SM2KeyPair(String publicKey, String privateKey) {
        this.publicKey = publicKey;
        this.privateKey = privateKey;
    }

    /** 公钥 */
    private String publicKey;
    /** 私钥 */
    private String privateKey;

    public String getPublicKey() {
        return publicKey;
    }

    public void setPublicKey(String publicKey) {
        this.publicKey = publicKey;
    }

    public String getPrivateKey() {
        return privateKey;
    }

    public void setPrivateKey(String privateKey) {
        this.privateKey = privateKey;
    }

}

工具类

import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;

import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.asn1.x9.X9ECPoint;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.InvalidCipherTextException;
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.params.ParametersWithRandom;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.util.encoders.Hex;

public class SM2Util {

    public static SM2KeyPair generatorSM2KeyPair() {
        ECDomainParameters domainParameters = getDomainParameters();

        ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
        try {
            keyPairGenerator
                .init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();

        BigInteger privatekey = ((ECPrivateKeyParameters)asymmetricCipherKeyPair.getPrivate()).getD();
        String privateKeyHex = privatekey.toString(16);

        ECPoint ecPoint = ((ECPublicKeyParameters)asymmetricCipherKeyPair.getPublic()).getQ();
        String publicKeyHex = Hex.toHexString(ecPoint.getEncoded(false));
        return new SM2KeyPair(publicKeyHex, privateKeyHex);
    }

    private static ECDomainParameters getDomainParameters() {
        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
        ECDomainParameters domainParameters =
            new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
        return domainParameters;
    }

    public static String deCode(String privateKeyHex, String cipherData) {
        ECDomainParameters domainParameters = getDomainParameters();
        BigInteger privateKeyD = new BigInteger(privateKeyHex, 16);
        ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters);
        SM2Engine sm2Engine = new SM2Engine();
        sm2Engine.init(false, privateKeyParameters);

        byte[] cipherDataByte = Hex.decode(cipherData);
        try {
            return new String(
                Base64.getDecoder().decode(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length)));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String enCode(String publicKeyHex, String cipherData) {
        byte[] cipherDataByte = Base64.getEncoder().encode(cipherData.getBytes());
        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
        ECDomainParameters domainParams =
            new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());

        X9ECPoint localX9ECPoint = new X9ECPoint(sm2ECParameters.getCurve(), Hex.decode(publicKeyHex.getBytes()));
        ECPublicKeyParameters pk = new ECPublicKeyParameters(localX9ECPoint.getPoint(), domainParams);
        CipherParameters pubKeyParameters = new ParametersWithRandom(pk);
        SM2Engine sm2Engine = new SM2Engine();
        sm2Engine.init(true, pubKeyParameters);
        try {

            return Hex.toHexString(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length));
        } catch (InvalidCipherTextException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void main(String[] args) {

        SM2KeyPair key = SM2Util.generatorSM2KeyPair();

        System.out.println(deCode(key.getPrivateKey(), enCode(key.getPublicKey(), 测试加解密")));

    }

}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中可以使用 Bouncy Castle 库来实现 SM2加密解密。以下是一个简单的示例代码: ```java import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.util.PrivateKeyFactory; import org.bouncycastle.crypto.util.PublicKeyFactory; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import java.security.Security; public class SM2Demo { public static void main(String[] args) throws Exception { // 添加 Bouncy Castle 作为安全提供程序 Security.addProvider(new BouncyCastleProvider()); // 生成随机密钥对 X9ECParameters ecParams = X9ECParameters.getInstance("sm2p256v1"); ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator(); keyPairGenerator.init(new ECKeyGenerationParameters(ecParams, new SecureRandom())); AsymmetricCipherKeyPair keyPair = keyPairGenerator.generateKeyPair(); // 转换为 Bouncy Castle 的密钥格式 ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) PrivateKeyFactory.createKey(keyPair.getPrivate().getEncoded()); ECPublicKeyParameters publicKey = (ECPublicKeyParameters) PublicKeyFactory.createKey(keyPair.getPublic().getEncoded()); // 明文数据 byte[] plaintext = "Hello, world!".getBytes(StandardCharsets.UTF_8); // 加密 CipherParameters encryptParams = new ParametersWithRandom(publicKey, new SecureRandom()); SM2Engine encryptEngine = new SM2Engine(); encryptEngine.init(true, encryptParams); byte[] ciphertext = encryptEngine.processBlock(plaintext, 0, plaintext.length); // 输出密文 System.out.println("Ciphertext: " + Hex.toHexString(ciphertext)); // 解密 CipherParameters decryptParams = privateKey; SM2Engine decryptEngine = new SM2Engine(); decryptEngine.init(false, decryptParams); byte[] plaintext2 = decryptEngine.processBlock(ciphertext, 0, ciphertext.length); // 输出明文 System.out.println("Plaintext: " + new String(plaintext2, StandardCharsets.UTF_8)); } } ``` 需要注意的是,Bouncy Castle 库可能需要单独引入,具体可以参考相关文档。此外,SM2 的密钥长度和加密算法都与传统的 RSA、AES 等算法有所不同,需要根据具体需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值