- 浏览: 800468 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (480)
- Spring (12)
- Hibernate (8)
- Struts2 (4)
- Java 基础-JDK-类-接口-URI-专题研究 (27)
- 线程、线程池、多线程高并发高可用、Socket通信 (15)
- Oracle数据库 (20)
- 一般-前端js-html-其它 (25)
- JYSK-互联网金融、金融科技、支付、公司、新闻等等 (8)
- Ajax-jQuery开源框架 (7)
- Json-轻量级的数据交换格式 (14)
- JavaScript (15)
- Jsp、Servlet、Servlet+JSP+JavaBean开发模式(MVC) (18)
- Html-JavaScript-前端-调用接口 (12)
- Sql Server 2005 (6)
- 正则表达式 (2)
- Java tools (18)
- 加签与验签、加密与解密 (3)
- Ajax技术核心-xmlHttpRequest(简称XHR) (6)
- xml-数据交换格式 (3)
- 信息采集 (1)
- Http - Https - HttpClient - httpCore-SSL-TLS (10)
- HtmlParser (2)
- 标签库 (1)
- SMS (2)
- jxl-导入导出 (4)
- poi-导入导出 (2)
- 定时器Timer+Quartz (6)
- 工作流引擎JBPM3.2.3 (4)
- 工作流引擎JBPM4 (0)
- 数据源-JNDI (0)
- tomcat、weblogic等应用服务器 (6)
- 工作流引擎jbpm5 (1)
- 搜索引擎Lucene (1)
- ant (1)
- 大数据-HBase (2)
- bigtable (0)
- 数据库设计 (4)
- jquery tab (0)
- mybatis (5)
- jquery ui 1.10.3 (5)
- Jboss7 (1)
- 规则引擎drools (0)
- 工作流引擎Activiti5 (0)
- 数据库-用户自定义函数 (0)
- 数据库-存储过程 (2)
- 数据库-视图 (0)
- 数据库-触发器 (0)
- 数据库-sql (2)
- highcharts-图表工具 (1)
- sql server 2008 (6)
- 诗词-工作室 (2)
- 数据割接 (1)
- GIS-地理信息系统 (2)
- RS-遥感技术 (1)
- GPS-全球定位系统 (1)
- java整合flex_RIA开发 (3)
- C#编程语言 (5)
- webservice_axis2_cxf_soap_wsdl (2)
- sql语句 (3)
- Flex_WebService_GIS (25)
- PHP编程语言 (0)
- ExtJS4.2 (1)
- Spring mvc (5)
- EasyUI1.4.2 (16)
- 日期时间工具类 (4)
- 随机数 (1)
- Arcgis api for js (0)
- Mysql数据库 (9)
- 移动互联网 java html5/flash socket netty (0)
- API接口 (1)
- AndroidStudio (0)
- Git (2)
- Maven (5)
- IDEA (0)
- 大数据-Hadoop (2)
- JPA (0)
- Spring boot (4)
- JSF (0)
- nginx_lua_module_redis (2)
- Activiti (1)
- bootstrap (1)
- AngularJS (10)
- 数据库-索引 (1)
- Linux及其连接工具SSH (4)
- java日志管理 (2)
- islider滑动控件 (1)
- jquery (1)
- 异常处理Exception (1)
- 秒杀与类秒杀系统 (1)
- 连接数据库、数据库连接池 (4)
- 数据库-临时表 (1)
- 软件设计模式-单例、多例、代理、工厂、观察者 (3)
- 集合框架 (5)
- 人工智能--Artificial intelligence、神经网络算法、机器学习 (1)
- 分布式应用 (1)
- SOA服务-Dubbo框架-Thrift框架 (2)
- Zookeeper分布式服务框架 (2)
- intellij idea (1)
- python编程语言 (0)
- 消息队列_MQ (0)
- 消息队列_RabbitMQ (2)
- 消息队列_ActiveMQ (1)
- 消息队列_Kafka (2)
- 缓存_Redis (4)
- 缓存_Memcache (0)
- 缓存_Ehcache (0)
- ivy-ivyde (1)
- google-protocol buffers (1)
- 正向代理-正向代理服务器 (1)
- 反向代理-反向代理服务器 (1)
- JVM内存模型 (0)
- Thunder框架 (1)
- NIO-非阻塞式IO (0)
- 软件测试、性能测试 (1)
- 序列化、Serializable接口、Externalizable接口 (3)
- 线程池-ExecutorService-ThreadPoolExecutor (1)
- web.xml (1)
- java开发-java工具-实用工具网站 (6)
- 医疗 (1)
- Filter-过滤器 (2)
- Unicode码-双字节字符编码 (1)
- OpenResty (1)
- 计算机网络 (1)
- eclipse_myeclipse_intellij idea (3)
- Enum (1)
- 大数据--Big Data (1)
- 云计算--Cloud computing (1)
- Elastic-Job (1)
- Redis (2)
- 文件流-IO操作 (6)
- 计算机基础知识 (1)
- Hessian-二进制RPC协议 (1)
- String类 (3)
- BigDecimal类 (1)
- java重要接口 (1)
- ReactJS (1)
- 跨域问题 (0)
- Map (1)
- 注解 (1)
- ASCII码-单字节字符编码 (1)
- 微服务、微服务架构 (2)
- RPC协议、RPC服务、RPC框架 (0)
- java反射 (1)
- java项目之classpath (1)
- 经典算法-树 (1)
- listener-监听器 (1)
- Interceptor-拦截器 (1)
- pojo javabean (2)
- 计算机科学与技术-进阶 (1)
- 代码规范与文档编写 (1)
- UML-统一建模语言 (1)
- 对接微信、支付宝 (3)
- 压力测试 (1)
- 办公软件-Excel (1)
- 办公软件-PPT (0)
- UTF8、GBK编码 (1)
- 微服务架构:Spring Cloud架构-Dubbo架构 (6)
- Nginx (1)
- 点滴业务 (1)
- form表单-json数据-转换与接口调用 (1)
- Junit单元测试 (1)
- 大数据-Spark (1)
- 大数据-Storm (1)
- 数据库事务-Spring事务 (0)
- elasticsearch (1)
- windows (1)
最新评论
一、加密算法:
1.1 散列算法(单向散列,不可逆)
MD5: Message Digest Algorithm 5,信息-摘要算法
SHA: Secure Hash Algorithm,安全散列算法,诸如:SHA1 SHA256 SHA512
HMAC:Hash Message Authentication Code,散列消息鉴别码
1.2 对称加密(加密解密使用同一秘钥,速度快)
1.2.1 DES:
DES是一种基于56位密钥的对称算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。现在DES已经不是一种安全的加密算法,已被公开破解,现在DES已经被高级加密标准(AES)所代替
1.2.2 3DES
3DES是DES的一种派生算法,主要提升了DES的一些实用所需的安全性。
1.2.3 AES
AES是现在对称加密算法中最流行的算法之一。
1.3 非对称加密(公钥加密,私钥解密,可以签名,更安全)
RSA
DSA
ECC
1.4 BASE64
严格来说Base64并不是一种加密/解密算法,而是一种编码方式。
Base64不生成密钥,通过Base64编码后的密文就可以直接“翻译”为明文,但是可以通过向明文中添加混淆字符来达到加密的效果。
二、加签算法:
SHA1WithRSA(是一个常用的RSA加签算法):用SHA算法进行签名,用RSA算法进行加密
参考博客:
https://blog.csdn.net/qq_35605213/article/details/80591869
http://www.cnblogs.com/KKatherine/p/4128444.html
https://www.cnblogs.com/tancky/p/6409823.html
https://blog.csdn.net/it_beecoder/article/details/71480770
https://blog.csdn.net/UtopiaOfArtoria/article/details/82429467
https://blog.csdn.net/u013151053/article/details/81949810
https://blog.csdn.net/poiuyppp/article/details/81145982
https://www.cnblogs.com/shuqi/p/java.html
https://www.2cto.com/kf/201804/738493.html
//
https://blog.csdn.net/lovelichao12/article/details/75007189
https://www.cnblogs.com/xyzq/p/6679400.html
https://blog.csdn.net/john2522/article/details/53365358
https://blog.csdn.net/u011518120/article/details/52184725
https://blog.csdn.net/cheng9981/article/details/52825554
示例demo:
1.1 散列算法(单向散列,不可逆)
MD5: Message Digest Algorithm 5,信息-摘要算法
SHA: Secure Hash Algorithm,安全散列算法,诸如:SHA1 SHA256 SHA512
HMAC:Hash Message Authentication Code,散列消息鉴别码
1.2 对称加密(加密解密使用同一秘钥,速度快)
1.2.1 DES:
DES是一种基于56位密钥的对称算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。现在DES已经不是一种安全的加密算法,已被公开破解,现在DES已经被高级加密标准(AES)所代替
1.2.2 3DES
3DES是DES的一种派生算法,主要提升了DES的一些实用所需的安全性。
1.2.3 AES
AES是现在对称加密算法中最流行的算法之一。
1.3 非对称加密(公钥加密,私钥解密,可以签名,更安全)
RSA
DSA
ECC
1.4 BASE64
严格来说Base64并不是一种加密/解密算法,而是一种编码方式。
Base64不生成密钥,通过Base64编码后的密文就可以直接“翻译”为明文,但是可以通过向明文中添加混淆字符来达到加密的效果。
二、加签算法:
SHA1WithRSA(是一个常用的RSA加签算法):用SHA算法进行签名,用RSA算法进行加密
参考博客:
https://blog.csdn.net/qq_35605213/article/details/80591869
http://www.cnblogs.com/KKatherine/p/4128444.html
https://www.cnblogs.com/tancky/p/6409823.html
https://blog.csdn.net/it_beecoder/article/details/71480770
https://blog.csdn.net/UtopiaOfArtoria/article/details/82429467
https://blog.csdn.net/u013151053/article/details/81949810
https://blog.csdn.net/poiuyppp/article/details/81145982
https://www.cnblogs.com/shuqi/p/java.html
https://www.2cto.com/kf/201804/738493.html
//
https://blog.csdn.net/lovelichao12/article/details/75007189
https://www.cnblogs.com/xyzq/p/6679400.html
https://blog.csdn.net/john2522/article/details/53365358
https://blog.csdn.net/u011518120/article/details/52184725
https://blog.csdn.net/cheng9981/article/details/52825554
示例demo:
import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Hex; /** * @description: RSA加密解密工具类 * @title: RSAUtils.java * @author: Administrator * @date: 2019年2月12日 * @version: 1.0.0 */ public class RSAUtils { /* 解释: RSA算法,需要两个密钥来进行加密和解密,分别是公钥和私钥。 需要注意的一点,这个公钥和私钥必须是一对的,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密,反之亦然。 由于加密和解密使用的是两个不同的密钥,因此,这种算法叫做非对称加密算法。 其算法具体实现基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 */ /** * 生产RSA密钥对 * @return */ public static Map<String,Object> generateKey(){ try { //实例化一个密钥对生成器 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); // ‘1024’,表示生成的是512位字符 keyPairGenerator.initialize(1024); KeyPair keyPair = keyPairGenerator.generateKeyPair(); RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic(); RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String,Object> keyPairs = new HashMap<>(); keyPairs.put("publicKey",rsaPublicKey); keyPairs.put("privateKey",rsaPrivateKey); return keyPairs; } catch (Exception e) { e.printStackTrace(); } return null; } /** * RSA私钥加密 * @param message 要加密的信息 * @param rsaPrivateKey RSA私钥 * @return 加密后的字符串 */ public static String encrypt(String message, RSAPrivateKey rsaPrivateKey){ try { PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, privateKey); byte[] resultBytes = cipher.doFinal(message.getBytes()); return Hex.encodeHexString(resultBytes); } catch (Exception e) { e.printStackTrace(); } return null; } /** * RSA公钥解密 * @param encryptMsg 要解密的信息 * @param rsaPublicKey RSA公钥 * @return 解密后的字符串 */ public static String decrypt(String encryptMsg, RSAPublicKey rsaPublicKey){ try { X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, publicKey); byte[] resultBytes = cipher.doFinal(Hex.decodeHex(encryptMsg.toCharArray())); return new String(resultBytes); } catch (Exception e) { e.printStackTrace(); } return null; } /** * RSA公钥加密 * @param message * @param rsaPublicKey * @return */ public static String rsaPublicKeyEncode(String message,RSAPublicKey rsaPublicKey){ try { Cipher cip = Cipher.getInstance("RSA"); cip.init(cip.ENCRYPT_MODE, rsaPublicKey); byte[] by = cip.doFinal(message.getBytes()); return Base64.encodeBase64String(by); } catch (Exception e) { throw new RuntimeException(e); } } /** * RSA私钥解密 * @param encryptMsg * @param rsaPrivateKey * @return */ public static String rsaPrivateKeyDecode(String encryptMsg,RSAPrivateKey rsaPrivateKey){ try { Cipher cip = Cipher.getInstance("RSA"); cip.init(cip.DECRYPT_MODE, rsaPrivateKey); byte[] by = Base64.decodeBase64(encryptMsg.getBytes()); return new String(cip.doFinal(by)); } catch (Exception e) { throw new RuntimeException(e); } } /** * RSA公钥字符串转公钥 * @param publicKeyStr */ public static RSAPublicKey getPublicKey(String publicKeyStr){ byte[] keyBytes=null; try { // keyBytes = (new BASE64Decoder()).decodeBuffer(publicKeyStr);//需引入jdk1.8 keyBytes=Base64.decodeBase64(publicKeyStr); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); return publicKey; } catch (Exception e) { throw new RuntimeException(e); } } /** * RSA私钥字符串转私钥 * @param privateKeyStr */ public static RSAPrivateKey getPrivateKey(String privateKeyStr){ byte[] keyBytes=null; try { // keyBytes = (new BASE64Decoder()).decodeBuffer(privateKeyStr);//需引入jdk1.8 keyBytes=Base64.decodeBase64(privateKeyStr); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec); return privateKey; } catch (Exception e) { throw new RuntimeException(e); } } /** * 测试 * @param args */ public static void main(String[] args) { Map<String, Object> map=RSAUtils.generateKey(); RSAPublicKey rsaPublicKey=(RSAPublicKey) map.get("publicKey"); RSAPrivateKey rsaPrivateKey=(RSAPrivateKey) map.get("privateKey"); //公钥 String publicKey=Base64.encodeBase64String(rsaPublicKey.getEncoded()); //私钥 String privateKey=Base64.encodeBase64String(rsaPrivateKey.getEncoded()); System.out.println("=========================生成RSA密钥对======================="); System.out.println("公钥:"+publicKey); System.out.println("私钥:"+privateKey); System.out.println("=========================示例1======================="); //【示例1】 String message="123456javaHELLO#$%_"; //rsa私钥加密 String encryptMessage=RSAUtils.encrypt(message, rsaPrivateKey); System.out.println("私钥加密后encryptMessage="+encryptMessage); //rsa公钥解密 String decryptMessage=RSAUtils.decrypt(encryptMessage, rsaPublicKey); System.out.println("公钥解密后decryptMessage="+decryptMessage); System.out.println("=========================示例2======================="); //【示例2】 String msg="123456javaHELLO#$%_中国"; //rsa公钥加密 String encryptMsg=RSAUtils.rsaPublicKeyEncode(msg, rsaPublicKey); System.out.println("公钥加密后encryptMsg="+encryptMsg); //rsa私钥解密 String decryptMsg=RSAUtils.rsaPrivateKeyDecode(encryptMsg, rsaPrivateKey); System.out.println("私钥解密后decryptMsg="+decryptMsg); System.out.println("==========================示例3======================"); //【示例3】 //前端js公钥加密后的字符串(注意"+"号的处理) //encodeURI(data).replace(/\+/g, '%2B'),后端处理时要将%2B转换回来 String encryptMsg2="giBQsrwlpkoRYoSkwzvHjkkiEES0Qu2CmanWDPedYwCBfSuUzU2zwEiergH5G+YzR53ygLDBs174lgvzoo8nbac/VbV5wPmrY7Pm9pTFeJR3uZBKvMvO23VxKzLUEPv6FvYif/0PYeUwS9AylRqONTbkNV6PV6E052rSaZlcUOE="; //后端保存的私钥 String privateKeyStr="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN1tjHRYRk5q8qxx+v+PibdNNh7lrHjPyo+zC6IOG7XG1o1Yd/vZVhtqaGIICCjs3w2sSQuD87sJSKkO+apnOnGhFNgA2lJVyZqZ0Hp8WZxT0EB/CYNec0iUQ9AWFnDujcGcL/qlCrgFDpLLMWiv1l4A3oV/prqiFRTunFxVhVGbAgMBAAECgYBjVvR+deQE5mI9D13GLcVhIRi4v92izcZYtcDwUVgJM02qWBhsOtMwtYpjAKt4gNyJK9QRgH9mWAHrJrbHxkwnPKKiso+qNNSb9Dbjbua25AS9HP2VQwkQUWBGagFvLQGatddK4f5nh7137+Jmld7VbfpY59BQvqS7lmzHfEmPQQJBAPR6hzNLHjnDZZ9wL092Trk02CN0aXOQsItHpypCiCzF7gmi2xPOGG8K4aOp5w/nIO1rr8eyl/5agvYXE51LsqsCQQDn3O3dZxw/jwUrhyWZJemkd2vBe1gUT0dnzEGhAIfLDinGiAg9NEBiMyFFHMXvyCIhOY2fxc9OZ+M2oeVLiVzRAkEAl7rb4ifC0JLGpVdY5XZFkYiMhCShtcmc6DRGOWIlZbRJ8c0TLo2AeJpGQ+8UqrgFpZRp+gSLdJ70HIth7wOmFQJAcgTu5AWkmozWWgVns9w0/S/MyaTCN5qU3rJPQ8FjBbO9T2ftxUtArgm+vqHbpIKiZfxLbNp1i3UDAwayH2c5QQJAf9OhvMVT/K9FsGzRHlIPyfUPFa9zKRCTw7RGKbrhoromycqOD23HV8EwCBvXUrAtqOC7TxxcX6wdQgq/zJZ7EA=="; //密钥转换 RSAPrivateKey rsaPrivateKey2=RSAUtils.getPrivateKey(privateKeyStr); //私钥解密 String decryptMsg2=RSAUtils.rsaPrivateKeyDecode(encryptMsg2, rsaPrivateKey2); System.out.println("前端js公钥加密,后端私钥解密后decryptMsg2="+decryptMsg2); } }
相关推荐
临商银行接口对接,加密解密加签验签整合,方便调用 临商银行接口对接,加密解密加签验签整合,方便调用 临商银行接口对接,加密解密加签验签整合,方便调用 临商银行接口对接,加密解密加签验签整合,方便调用 临商...
3,验证签名目前使用的UTF8格式,加签和验签必须保持统一,私钥加密,公钥解密。 4,静态库分release版本和debug版本 5,注意VC6.0中编译的使用的环境 MDd 还是MD 工程环境和静态库环境一直 6,本工程使用的库为:...
SM2算法可以生成密钥和公钥,支持SM2的签名和验签;AES加密解密,支持各种常用的堆成非对称的加密算法的加密解密和验签
* RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加...
在Spring框架中,我们经常需要处理加密解密和签名验证的问题,以确保数据传输的安全性和完整性。RSA与SHA-256结合使用可以提供更高级别的安全保护。RSA用于非对称加密,而SHA-256用于生成消息摘要,进行数字签名。 ...
java(sm2公私钥生成、加签、验签、加密、解密)demo案列
本示例"加签加密解密验签demo"旨在演示如何实现这一过程,通常涉及对称加密、非对称加密和数字签名等技术。 首先,我们来看“加签”。这里的“加签”指的是数字签名,它是公钥密码学的一种应用。数字签名并非传统的...
RSA加密解密签名加签验签RsaUtils工具类 RSA算法基于大数因子分解难题,提供了公钥加密和私钥解密的能力。公钥用于加密,私钥则负责解密。这种特性使得RSA成为保证数据传输安全的理想选择。 公钥加密私钥解密与...
本文将详细讲解RSA算法的加签、加密、解密以及验签的过程,结合Java语言来实现这一系列操作,并涉及到证书的使用。 首先,我们需要理解RSA算法的基本原理。RSA算法基于两个大素数的乘积难以分解这一数学难题,生成...
在C#中实现RSA加密解密和签名验签,我们可以利用.NET框架提供的System.Security.Cryptography命名空间中的相关类。 1. RSA加密原理: RSA基于数论中的大数因子分解难题,即给定一个大合数N,找到它的两个素数因子p...
SM2加密解密、签名验签Delphi Lazarus版本源码 简介 本仓库提供了一个基于MIRACL大数库实现的国密2(SM2)非对称加密解密、签名验签工具的源码。该工具使用Delphi 7编写,适用于Delphi和Lazarus开发环境。 功能特点...
本文将深入探讨如何使用OpenSSL库在C++中实现RSA加密、解密以及签名和验签功能,特别关注SHA256WithRSA这一安全强度更高的签名方法。 首先,RSA的核心原理是基于大整数因子分解的困难性。它包含一对密钥,即公钥和...
国密SM2_SM3加密解密,加签验签操作C#源码,网络上很难找的资源,实现了密SM2_SM3加密解密,加签验签操作,.NET版
java aes128/256 对称加密解密,rsa对称加密解密验签实现,php java通用aes加密 支持任何形式的aes加密,文件,字符,字节等,内含php代码,可以与php平台实现aes加密,而且包含rsa非对称加密签名验签实现,都是对...
在这个项目中,开发者使用C语言和Visual Studio 2010创建了三个工具:ECC密钥生成器、ECC加密解密工具以及ECC签名验签工具,这些工具都基于OpenSSL库进行关键操作。 首先,ECC密钥生成器是用于创建ECC密钥对的核心...
国密SM2_SM3加密解密,加签验签操作C#源码 复刻Java 完整有效
C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 对应文章: http://blog.csdn.net/gzy11/article/details/54573973
SM2 SM4 后端加密解密资源
亲自总结验证,源码可用,RSA加密、解密、加签、验签,提醒:私钥加签公租验签。其中一对测试的公钥和私钥,密码在资源说明文件中,还包括java生成公私钥的方法,后面会上传C#生成租钥pfx和证书的方法和操作说明。