package com.sdyy.common.bc_sm2;

import org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import org.bouncycastle.util.encoders.Hex; import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Enumeration; /**
* @创建人
* @创建时间 2020/5/7
* @描述
*/
public class BcUtils {
// private static String sm2PfxLocation = ConfigService.getConfig("SM2_PFX_LOCATION");
private static String certStr = "MIIBszCCAV6gAwIBAgIGAWEmMrj+MAwGCCqBHM9VAYN1BQAwHzELMAkGA1UEBhMC\n" +
"Q04xEDAOBgNVBAMTB0F1dG9DQUQwHhcNMTgwMTI0MDMyNTEyWhcNMzUwODA1MTYw\n";
public static void main(String[] args) throws Exception{
String orgData = "123123123";//要签名的数据
String algorithm = "SM3withSM2";
String yqData = "123123123";//要签名的数据
String pfxFile = "D:/ESM.pfx";//sm2证书对应的pfx
String password = "111111"; //pfx访问密码
Security.addProvider(new BouncyCastleProvider());
FileInputStream fis = new FileInputStream(pfxFile);
KeyStore ks2 = KeyStore.getInstance("PKCS12", "BC");
ks2.load(fis, password.toCharArray());
Enumeration enum1 = ks2.aliases();
String keyAlias = null;
if (enum1.hasMoreElements())
{
keyAlias = (String)enum1.nextElement();
}
Signature sig = Signature.getInstance(algorithm, "BC");
sig.initSign((PrivateKey) ks2.getKey(keyAlias, null), new SecureRandom());
sig.update(orgData.getBytes());
byte[] rs = sig.sign();
String str = Hex.toHexString(rs);
System.out.println(str);
//验证签名
sm2VerifySignedData(rs,certStr,yqData);
}
/**
*sm2对签名后的数据进行验签
* @param rs 签名产生签名值
* @param certKey 证书串,及公钥
* @param signValue 签名原文
* @return
*/
public static void sm2VerifySignedData(byte[] rs,String certKey,String signValue){
try {
CertificateFactory factory = new CertificateFactory();
X509Certificate certificate = (X509Certificate) factory.engineGenerateCertificate(new ByteArrayInputStream(Base64.decode(certKey)));
System.out.println(certificate.getSigAlgName());
// 验证签名
Signature signature = Signature.getInstance(certificate.getSigAlgName(), new BouncyCastleProvider());
signature.initVerify(certificate);
signature.update(signValue.getBytes(StandardCharsets.UTF_8));
System.out.println(signature.verify(rs));
}catch (Exception e){
e.printStackTrace();
}
}
//bc包sm2签名 /**
* bc包sm2签名
* @param data 待签数据
* @param pfxFile pfx文件地址(sm2证书对应的pfx)
* @param password pfx访问密码
* @return 签名值
*/
public static byte[] sm2SignData(String data,String pfxFile,String password){
try {
String algorithm = "SM3withSM2";
Security.addProvider(new BouncyCastleProvider());
FileInputStream fis = new FileInputStream(pfxFile);
KeyStore ks2 = KeyStore.getInstance("PKCS12", "BC");
ks2.load(fis, password.toCharArray());
Enumeration enum1 = ks2.aliases();
String keyAlias = null;
if (enum1.hasMoreElements())
{
keyAlias = (String)enum1.nextElement();
}
Signature sig = Signature.getInstance(algorithm, "BC");
sig.initSign((PrivateKey) ks2.getKey(keyAlias, null), new SecureRandom());
sig.update(data.getBytes());
byte[] rs = sig.sign();
String str = Hex.toHexString(rs);
System.out.println(str);
return rs;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}

Java BC包做sm2加密方法 ,签名验签方法的更多相关文章

  1. RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

    原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptograph ...

  2. js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  3. C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic

    C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...

  4. Java RSA 加密 解密 签名 验签

    原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...

  5. RSA密钥生成、加密解密、签名验签

    RSA 非对称加密公钥加密,私钥解密 私钥签名,公钥验签 下面是生成随机密钥对: //随机生成密钥对 KeyPairGenerator keyPairGen = null; try { keyPair ...

  6. 利用SHA-1算法和RSA秘钥进行签名验签(带注释)

    背景介绍 1.SHA 安全散列算法SHA (Secure Hash Algorithm)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,一般称为SHA-1.其对长度不超过264二进制 ...

  7. [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome

    Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...

  8. 数据安全管理:RSA加密算法,签名验签流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.RSA算法简介 1.加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用.可以在不直接传递密钥的情况下,完成加 ...

  9. RSA签名验签

    import android.util.Base64; import java.security.KeyFactory; import java.security.PrivateKey; import ...

随机推荐

  1. Html5移动端弹幕动画实现示例代码

    已知20条内容要有弹幕效果,分成三层,速度随机. 先来看看效果: 所以这里不考虑填写生成的.只是一个展现的效果. 如果要看填写生成的,请不要浪费Time 思路 把单个内容编辑好,计算自身宽度,确定初始 ...

  2. VXLAN 基础教程:在 Linux 上配置 VXLAN 网络

    上篇文章结尾提到 Linux 是支持 VXLAN 的,我们可以使用 Linux 搭建基于 VXLAN 的 overlay 网络,以此来加深对 VXLAN 的理解,毕竟光说不练假把式. 1. 点对点的 ...

  3. Java匹马行天下之JavaSE核心技术——异常处理

    Java匹马行天下之JavaSE核心技术——异常处理 异常的简介 在Java中,异常就是Java在编译.运行或运行过程中出现的错误. 程序错误分为三种:编译错误.运行时错误和逻辑错误 编译错误是因为程 ...

  4. J - The sum problem

    Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequences that the sum ...

  5. D - Fox And Two Dots DFS

    Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...

  6. Go gRPC进阶-go-grpc-middleware使用(八)

    前言 上篇介绍了gRPC中TLS认证和自定义方法认证,最后还简单介绍了gRPC拦截器的使用.gRPC自身只能设置一个拦截器,所有逻辑都写一起会比较乱.本篇简单介绍go-grpc-middleware的 ...

  7. PHP函数:fopen

    fopen()  - 打开文件或者 URL. 注意:array_key_exists() 仅仅搜索第一维的键. 多维数组里嵌套的键不会被搜索到. 说明: fopen ( string $filenam ...

  8. 基于scrapy框架输入关键字爬取有关贴吧帖子

    基于scrapy框架输入关键字爬取有关贴吧帖子 站点分析 首先进入一个贴吧,要想达到输入关键词爬取爬取指定贴吧,必然需要利用搜索引擎 点进看到有四种搜索方式,分别试一次,观察url变化 我们得知: 搜 ...

  9. pytorch中CUDA类型的转换

    import torch import numpy as np device = torch.device("cuda:0" if torch.cuda.is_available( ...

  10. SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?

    往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...