依赖 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.signer = new SM2Signer();}return this.signer;}public void setTestFlag(boolean isTest){this.isTest = isTest;}public static String[] generateKeyPair(boolean isTest){AsymmetricCipherKeyPair kPair = genCipherKeyPair(isTest);ECPrivateKeyParameters ecPriv = (ECPrivateKeyParameters)kPair.getPrivate();ECPublicKeyParameters ecPub = (ECPublicKeyParameters)kPair.getPublic();BigInteger privateKey = ecPriv.getD();ECPoint publicKey = ecPub.getQ();byte[] priv = privateKey.toByteArray();byte[] pub = publicKey.getEncoded(false);if (priv.length == 33){logger.debug("private key size 33");byte[] newPriv = new byte[32];System.arraycopy(priv, 1, newPriv, 0, 32);priv = newPriv;}String[] keyPairs = new String[2];keyPairs[0] = ByteUtils.toHexString(pub);keyPairs[1] = ByteUtils.toHexString(priv);return keyPairs;}public static String[] generateKeyPair(){return generateKeyPair(false);}public static String[] generateKeyPairBase64(){AsymmetricCipherKeyPair kPair = genCipherKeyPair(false);ECPrivateKeyParameters ecPriv = (ECPrivateKeyParameters)kPair.getPrivate();ECPublicKeyParameters ecPub = (ECPublicKeyParameters)kPair.getPublic();BigInteger privateKey = ecPriv.getD();ECPoint publicKey = ecPub.getQ();byte[] priv = privateKey.toByteArray();byte[] pub = publicKey.getEncoded(false);if (priv.length == 33){logger.debug("private key size 33");byte[] newPriv = new byte[32];System.arraycopy(priv, 1, newPriv, 0, 32);priv = newPriv;}String[] keyPairs = new String[2];keyPairs[0] = Base64.getEncoder().encodeToString(pub);keyPairs[1] = Base64.getEncoder().encodeToString(priv);return keyPairs;}private static AsymmetricCipherKeyPair genCipherKeyPair(boolean isTest){SM2Param param = new SM2Param(isTest);ECKeyGenerationParameters ecGenParam = new ECKeyGenerationParameters(param.ecc_bc_spec, new SecureRandom());ECKeyPairGenerator ecKeyPairGenerator = new ECKeyPairGenerator();ecKeyPairGenerator.init(ecGenParam);return ecKeyPairGenerator.generateKeyPair();}private ECPublicKeyParameters getPublicKeyCipherParams(){if (null == this.publicKeyParams) {throw new NullPointerException("no public key");}return this.publicKeyParams;}private ECPrivateKeyParameters getPrivateKeyCipherParams(){if (null == this.privateKeyParams) {throw new NullPointerException("no private key");}return this.privateKeyParams;}public String encryptBase64(String plainText)throws CryptoException{byte[] cipherByte = encrypt(plainText.getBytes());String cipherBase64 = Base64.getEncoder().encodeToString(cipherByte);return cipherBase64;}public String encryptHex(String plainText)throws CryptoException{byte[] cipherByte = encrypt(plainText.getBytes());String cipherHex = ByteUtils.toHexString(cipherByte);return cipherHex;}public byte[] encrypt(byte[] plainText)throws CryptoException{SM2Engine sm2Engine = getEnginer();if (this.isTest) {sm2Engine.init(true, new ParametersWithRandom(getPublicKeyCipherParams(), new TestRandomBigInteger("4C62EEFD6ECFC2B95B92FD6C3D9575148AFA17425546D49018E5388D49DD7B4F", 16)));} else {sm2Engine.init(true, new ParametersWithRandom(getPublicKeyCipherParams()));}byte[] cipher = sm2Engine.processBlock(plainText, 0, plainText.length);return cipher;}public String decryptBase64(String cipherBase64)throws CryptoException, UnsupportedEncodingException{byte[] plainByte = decrypt(Base64.getDecoder().decode(cipherBase64));return new String(plainByte, "UTF-8");}public String decryptHex(String cipherHex)throws CryptoException, UnsupportedEncodingException{byte[] plainByte = decrypt(ToolsUtil.hexStrToByte(cipherHex));return new String(plainByte, "UTF-8");}public byte[] decrypt(byte[] cipher)throws CryptoException{SM2Engine sm2Engine = getEnginer();sm2Engine.init(false, getPrivateKeyCipherParams());byte[] decryptData = sm2Engine.processBlock(cipher, 0, cipher.length);return decryptData;}public String signBase64(String msg, String id)throws CryptoException{if (null == msg) {return "";}byte[] sign = null == id ? sign(msg.getBytes()) : sign(msg.getBytes(), id.getBytes());String signBase64 = Base64.getEncoder().encodeToString(sign);return signBase64;}public String signHex(String msg, String id)throws CryptoException{if (null == msg) {return "";}byte[] sign = null == id ? sign(msg.getBytes()) : sign(msg.getBytes(), id.getBytes());String signHex = ByteUtils.toHexString(sign);return signHex;}public byte[] sign(byte[] msg)throws CryptoException{return sign(msg, null);}public byte[] sign(byte[] msg, byte[] id)throws CryptoException{ECPrivateKeyParameters privateKeyParameters = getPrivateKeyCipherParams();SM2Signer sm2Signer = getSigner();CipherParameters cParameters = null;if (this.isTest){if (null != id) {cParameters = new ParametersWithID(new ParametersWithRandom(privateKeyParameters, new TestRandomBigInteger("6CB28D99385C175C94F94E934817663FC176D925DD72B727260DBAAE1FB2F96F", 16)), id);} else {cParameters = new ParametersWithRandom(privateKeyParameters, new TestRandomBigInteger("6CB28D99385C175C94F94E934817663FC176D925DD72B727260DBAAE1FB2F96F", 16));}}else if (null != id) {cParameters = new ParametersWithID(new ParametersWithRandom(privateKeyParameters), id);} else {cParameters = new ParametersWithRandom(privateKeyParameters);}sm2Signer.init(true, cParameters);sm2Signer.update(msg, 0, msg.length);byte[] sig = sm2Signer.generateSignature();if (this.isTest){BigInteger[] rs = decodeSignature(sig);logger.debug("sign r size: {}, hex: {}", Integer.valueOf(rs[0].toByteArray().length), ByteUtils.toHexString(rs[0].toByteArray()));logger.debug("sign s size: {}, hex: {}", Integer.valueOf(rs[1].toByteArray().length), ByteUtils.toHexString(rs[1].toByteArray()));}return sig;}public boolean verifySignBase64(String msg, String signatureBase64, String id){return null == id ? verifySign(msg.getBytes(), Base64.getDecoder().decode(signatureBase64)) : verifySign(msg.getBytes(), Base64.getDecoder().decode(signatureBase64), id.getBytes());}public boolean verifySignHex(String msg, String signatureHex, String id){return null == id ? verifySign(msg.getBytes(), ToolsUtil.hexStrToByte(signatureHex)) : verifySign(msg.getBytes(), ToolsUtil.hexStrToByte(signatureHex), id.getBytes());}public boolean verifySign(byte[] msg, byte[] signature){return verifySign(msg, signature, null);}public boolean verifySign(byte[] msg, byte[] signature, byte[] id){SM2Signer sm2Signer = getSigner();CipherParameters cParameters = null;if (null != id) {cParameters = new ParametersWithID(getPublicKeyCipherParams(), id);} else {cParameters = getPublicKeyCipherParams();}sm2Signer.init(false, cParameters);sm2Signer.update(msg, 0, msg.length);boolean result = sm2Signer.verifySignature(signature);return result;}private static BigInteger[] decodeSignature(byte[] sig){ASN1Sequence s = ASN1Sequence.getInstance(sig);return new BigInteger[] {decodeValue(s.getObjectAt(0)), decodeValue(s.getObjectAt(1)) };}private static BigInteger decodeValue(ASN1Encodable e){return ASN1Integer.getInstance(e).getValue();}public SM2() {}public static class SM2Param{public static final String[] ecc_param_test = { "8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3", "787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498", "63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A", "8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7", "421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D", "0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2" };public static String[] ecc_param = { "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0" };public final BigInteger ecc_p;public final BigInteger ecc_a;public final BigInteger ecc_b;public final BigInteger ecc_n;public final BigInteger ecc_gx;public final BigInteger ecc_gy;public final ECCurve ecc_curve;public final ECDomainParameters ecc_bc_spec;public SM2Param(boolean isTest){if (isTest){this.ecc_p = new BigInteger(ecc_param_test[0], 16);this.ecc_a = new BigInteger(ecc_param_test[1], 16);this.ecc_b = new BigInteger(ecc_param_test[2], 16);this.ecc_n = new BigInteger(ecc_param_test[3], 16);this.ecc_gx = new BigInteger(ecc_param_test[4], 16);this.ecc_gy = new BigInteger(ecc_param_test[5], 16);}else{this.ecc_p = new BigInteger(ecc_param[0], 16);this.ecc_a = new BigInteger(ecc_param[1], 16);this.ecc_b = new BigInteger(ecc_param[2], 16);this.ecc_n = new BigInteger(ecc_param[3], 16);this.ecc_gx = new BigInteger(ecc_param[4], 16);this.ecc_gy = new BigInteger(ecc_param[5], 16);}this.ecc_curve = new ECCurve.Fp(this.ecc_p, this.ecc_a, this.ecc_b, this.ecc_n, ECConstants.ONE);this.ecc_bc_spec = new ECDomainParameters(this.ecc_curve, this.ecc_curve.createPoint(this.ecc_gx, this.ecc_gy), this.ecc_n);}}public static class TestData{public static final String ENCRYPT_KEYPAIR_RANDOM = "1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0";public static final String ENCRYPT_INIT_RANDOM = "4C62EEFD6ECFC2B95B92FD6C3D9575148AFA17425546D49018E5388D49DD7B4F";public static final String ENCRYPT_PUBLIC_KEY_HEX = "04435b39cca8f3b508c1488afc67be491a0f7ba07e581a0e4849a5cf70628a7e0a75ddba78f15feecb4c7895e2c1cdf5fe01debb2cdbadf45399ccf77bba076a42";public static final String ENCRYPT_PRIVATE_KEY_HEX = "1649ab77a00637bd5e2efe283fbf353534aa7f7cb89463f208ddbc2920bb0da0";public static final String ENCRYPT_PLAIN_TEXT = "encryption standard";public static final String SIGN_KEYPAIR_RANDOM = "128B2FA8BD433C6C068C8D803DFF79792A519A55171B1B650C23661D15897263";public static final String SIGN_INIT_RANDOM = "6CB28D99385C175C94F94E934817663FC176D925DD72B727260DBAAE1FB2F96F";public static final String SIGN_PUBLIC_KEY_HEX = "040ae4c7798aa0f119471bee11825be46202bb79e2a5844495e97c04ff4df2548a7c0240f88f1cd4e16352a73c17b7f16f07353e53a176d684a9fe0c6bb798e857";public static final String SIGN_PRIVATE_KEY_HEX = "128b2fa8bd433c6c068c8d803dff79792a519a55171b1b650c23661d15897263";public static final String SIGN_ID = "ALICE123@YAHOO.COM";public static final String SIGN_MESSAGE = "message digest";}
}
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;public class ToolsUtil
{private static final Pattern hexPattern = Pattern.compile("^[a-f0-9]+$", 2);public static boolean isHex(CharSequence value){if (null == value) {return false;}return hexPattern.matcher(value).matches();}public static byte[] decode(String str){if (null == str) {return null;}if (isHex(str)) {return hexStrToByte(str);}return Base64.getDecoder().decode(str);}public static String hexStrToBase64(String hexStr){return Base64.getEncoder().encodeToString(hexStrToByte(hexStr));}public static String base64ToHexStr(String base64Str){return ByteUtils.toHexString(Base64.getDecoder().decode(base64Str));}public static byte[] hexStrToByte(String hexStr){if ((null == hexStr) || (hexStr.length() == 0)) {return null;}char[] hexData = hexStr.toCharArray();int len = hexData.length;if ((len & 0x1) != 0) {throw new RuntimeException("Odd number of characters.");}byte[] out = new byte[len >> 1];int i = 0;for (int j = 0; j < len; i++){int f = toDigit(hexData[j], j) << 4;j++;f |= toDigit(hexData[j], j);j++;out[i] = ((byte)(f & 0xFF));}return out;}private static int toDigit(char ch, int index){int digit = Character.digit(ch, 16);if (digit == -1) {throw new RuntimeException("Illegal hexadecimal character " + ch + " at index " + index);}return digit;}
}
import com.pab.sm.SM2;
import org.bouncycastle.crypto.CryptoException;public class SM2Util
{public static String sign(String data, String priKey)throws CryptoException{SM2 sm2 = new SM2(null, priKey);return sm2.signHex(data, null);}public static boolean verifySignHex(String data, String pubKey, String signHex){SM2 sm2 = new SM2(pubKey, null);return sm2.verifySignHex(data, signHex, null);}public static String[] generateKeyPair(){return SM2.generateKeyPair();}
}

JAVA版本与C#配对的SM2加签验签相关推荐

  1. 国密:SM2公私钥加签验签

    一.工具类 POM中增加hutool <dependency><groupId>cn.hutool</groupId><artifactId>hutoo ...

  2. RSA体系 c++/java相互进行加签验签--转

    在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java ...

  3. java RSA 加签验签【转】

    引用自: http://blog.csdn.net/wangqiuyun/article/details/42143957/ java RSA 加签验签 package com.testdemo.co ...

  4. java rsa加密 加签_RSA加密解密与加签验签

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...

  5. php对接java验签,PHP教程:php对接java现实加签验签的实例

    <PHP教程:php对接java现实加签验签的实例>要点: 本文介绍了PHP教程:php对接java现实加签验签的实例,希望对您有用.如果有疑问,可以联系我们. PHP教程java生成的密 ...

  6. 前后端RSA互相加解密、加签验签、密钥对生成(Java)

    目录 一.序言 二.关于PKCS#1和PKCS#8格式密钥 1.简介 2.区别 二.关于JSEncrypt 三.关于jsrsasign 四.前端RSA加解密.加验签示例 1.相关依赖 2.crypto ...

  7. java支付宝rsa2签名,使用支付宝SDK进行RSAj加签验签以及加密解密

    /** * 支付宝 sdk 加签验签测试 * * @author 码农猿 */ public class SignDemo { /** * 公钥 */ private static final Str ...

  8. 聊一聊关于加解密、加签验签的那些事

    面对MD5.SHA.DES.AES.RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密.私钥解密.私钥加签.公钥验签.这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要 ...

  9. 速看: 加解密、加签验签,你想要的都在这了

    点击蓝色"java大数据修炼之道"关注我哟加个"星标",每晚21:00,一起学技术 来源: jianshu.com/p/5e9fe1fff6a3 作者: 不学无 ...

最新文章

  1. STM32 USB-HID通信移植步骤
  2. kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)
  3. 组件间数据交互——父组件向子组件传值( props属性值类型) 子组件向父组件传值-携带参数 || 非父子组件间传值
  4. eval在类型转换的妙用
  5. Webdriver API (二)
  6. jqGrid表格展示简单实例
  7. 2017.6.21 大都市meg 思考记录
  8. 去掉java文件中的注释_利用JavaParser去除java文件中的注释
  9. 为什么单线程的Redis能够达到百万级的QPS?
  10. Linux- 控制 LED 灯设备(LED 子系统)
  11. 记一次ASP绕过WTS-WAF
  12. 零基础转行学编程技术难吗?
  13. ​跨学科整合,打造大数据最强集团军:清华大学大数据能力提升项目宣讲会来了!...
  14. Android EditText简单自定义边框样式
  15. 一些javascript内容
  16. java基础学习——Swing图形化用户界面编程
  17. ubuntu设置开机启动程序
  18. 企业邮箱搭建模式优劣分析
  19. 各进制之间的转换(二、八、十、十六)
  20. 计算机网络是按覆盖地域划分吗,下列哪些计算机网络是按覆盖地域划分的()。...

热门文章

  1. 迅雷 java_Java实现迅雷地址转成普通地址实例代码
  2. matlab批量下载网页文件
  3. 一个丰富的音乐播放封装库,支持多种音频格式,完美解决你的问题。
  4. 高德地图教程_poi搜索以及显示
  5. Android 蓝牙 搜索周围设备代码流程分析-framework到协议栈流程
  6. state=08S01,code=0
  7. SpringBoot application.properties读取属性配置文件中文显示为乱码问题的解决
  8. 邮件营销EDM模板制作规范
  9. pandas读取行列数据-详细介绍(连续不连续)
  10. 【综合算法】不考虑误差的TDOA定位