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. 实战|使用Spark Streaming写入Hudi

    欢迎关注微信公众号:ApacheHudi,解锁下一代数据湖技术 1. 项目背景 传统数仓的组织架构是针对离线数据的OLAP(联机事务分析)需求设计的,常用的导入数据方式为采用sqoop或spark定时 ...

  2. Gallery实现图片拖动切换

    Gallery中文意思为画廊,通过Gallery能够实现用手指在屏幕上滑动实现图片的拖动.效果如下: 上面,为了学习了解,只用了android默认的Icon图片. 主程序中创建了一个继承自BaseAd ...

  3. 深入理解new运算符

    在 JavaScript 中,new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例.创建一个对象很简单,为什么我们还要多此一举使用 new 运算符呢?它到底有什么样的魔力? 认 ...

  4. python输出中文乱码

    首选项-浏览插件目录-USER文件夹 找到编译环境设置,编译方式为UTF-8编码 { "cmd": ["c:/Python36/python.exe",&quo ...

  5. Problem F Free Weights

    二分答案. 思路:对于二分给定的mid,即当前允许移动的最大重量,我们可以把小于改重量的标记一下,然后把没有标记的按照顺序放到另一个数组,然后判断是否满足两两相同. #include<bits/ ...

  6. PrestoSPI安全扩展

    由于Presto官方文档和谷歌搜索都没有相关的内容,git项目中也没有支持sentry的安全插件扩展,因此只能从源码中寻找答案,在梳理完SPI包的安全相关源码结构后,已实现了一个自定义的安全插件,经验 ...

  7. Cucumber(3)——命令以及日志

    目录 回顾 基本执行命令 关于日志的生成 回顾 在上一节中,我介绍了cucumber一些基本的语法内容,如果你还没有进行相关的了解或者环境的配置,你可以点击这里来进行了解一下 在本节中,我会对cucu ...

  8. el-tab-pane label的文字内容怎样设间距

    el-tab-pane label的文字内容怎样设间距 问题描述: 在使用element-ui的el-tab-pane做标签页时,label属性的位置与样式不能通过style样式直接解决 百度后几乎没 ...

  9. [De1CTF 2019]SSRF Me

    原帖地址 : https://xz.aliyun.com/t/5927 De1CTF 2019 的一个题目总结 题目描述 直接查看页面源代码可以看到正确格式的代码 #! /usr/bin/env py ...

  10. 【题解】P4570 [BJWC2011]元素 - 线性基 - 贪心

    P4570 [BJWC2011]元素 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 给你 \(n\) 个二元组 \( ...