JAVA版本与C#配对的SM2加签验签

依赖 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.</
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是 sm2 签验的示例代码,使用了 Bouncy Castle 库: ```java import org.bouncycastle.crypto.CryptoException; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.signers.SM2Signer; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import java.security.*; import java.security.spec.ECParameterSpec; import java.security.spec.ECPoint; import java.security.spec.ECPublicKeySpec; import java.security.spec.InvalidKeySpecException; public class SM2Demo { public static void main(String[] args) throws NoSuchProviderException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeySpecException, InvalidKeyException, SignatureException, CryptoException { Security.addProvider(new BouncyCastleProvider()); // 生成密钥对 KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC"); ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("sm2p256v1"); kpg.initialize(ecSpec, new SecureRandom()); KeyPair keyPair = kpg.generateKeyPair(); // 待名数据 String data = "Hello, world!"; byte[] dataBytes = data.getBytes(); // 生成SM2Signer signer = new SM2Signer(); signer.init(true, keyPair.getPrivate()); signer.update(dataBytes, 0, dataBytes.length); byte[] signature = signer.generateSignature(); // 验证名 signer.init(false, keyPair.getPublic()); signer.update(dataBytes, 0, dataBytes.length); boolean verified = signer.verifySignature(signature); System.out.println("Signature: " + Hex.toHexString(signature)); System.out.println("Verified: " + verified); } } ``` 注意:需要先添 Bouncy Castle 作为安全提供者。在示例代码中,我们使用了 SM2Signer 类来进行和验操作,使用了 ECNamedCurveTable 类来获取 SM2 的椭圆曲线参数。在实际应用中,密钥对的生成应该是在安全的环境下进行,而不是在代码中直接生成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值