Java实现SM2算法(国密算法)
Java实现SM2算法(国密算法)
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位
一、SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
二、SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
三、SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
四、SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
POM依赖:
<!--国密-->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version>
</dependency>
SM2加解密代码:
/*** @author SongWei* @version 1.0.0* @ClassName spring-cloud.com.boot.cloud.encryption.sm.Sm2Utils.java* @Description SM2加解密工具类* @createTime 2018年10月28日 13:57:00*/
public class Sm2Utils{/*** 生成随机秘钥对** @Version: 1.0.0* @return: Map<String, String>* @author: SongWei* @date: 2018/10/28 13:57*/public static Map<String, String> generateKeyPair() {SM2 sm2 = SM2.Instance();AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();//解密密钥BigInteger privateKey = ecpriv.getD(); //加密密钥ECPoint publicKey = ecpub.getQ(); Map<String, String> resutlMap = new HashMap<String, String>();resutlMap.put("privateKey", SecurityUtils.byteToHex(privateKey.toByteArray()));resutlMap.put("publicKey", SecurityUtils.byteToHex(publicKey.getEncoded()));return resutlMap;}/*** SM2加密** @param publicKey <p>公钥</p>* @param data <p>需要加密的数据</p>* @Version: 1.0.0* @return: String* @author: SongWei* @date: 2018/10/28 13:57*/public static String encrypt(byte[] publicKey, byte[] data) throws IOException {if (publicKey == null || publicKey.length == 0) {return null;}if (data == null || data.length == 0) {return null;}byte[] source = new byte[data.length];System.arraycopy(data, 0, source, 0, data.length);Cipher cipher = new Cipher();SM2 sm2 = SM2.Instance();ECPoint userKey = sm2.ecc_curve.decodePoint(publicKey);ECPoint c1 = cipher.Init_enc(sm2, userKey);cipher.Encrypt(source);byte[] c3 = new byte[32];cipher.Dofinal(c3);//C1 C2 C3拼装成加密字串return SecurityUtils.byteToHex(c1.getEncoded()) + SecurityUtils.byteToHex(source) + SecurityUtils.byteToHex(c3);}/*** 数据解密** @param privateKey <p>私钥</p>* @param encryptedData <p>需要解密的内容</p>* @Version: 1.0.0* @return: byte* @author: SongWei* @date: 2018/10/18 13:59*/public static byte[] decrypt(byte[] privateKey, byte[] encryptedData) throws IOException {if (privateKey == null || privateKey.length == 0) {return null;}if (encryptedData == null || encryptedData.length == 0) {return null;}//加密字节数组转换为十六进制的字符串 长度变为encryptedData.length * 2String data = SecurityUtils.byteToHex(encryptedData);/*** 分解加密字串* (C1 = C1标志位2位 + C1实体部分128位 = 130)* (C3 = C3实体部分64位 = 64)* (C2 = encryptedData.length * 2 - C1长度 - C2长度)*/byte[] c1Bytes = SecurityUtils.hexToByte(data.substring(0, 130));int c2Len = encryptedData.length - 97;byte[] c2 = SecurityUtils.hexToByte(data.substring(130, 130 + 2 * c2Len));byte[] c3 = SecurityUtils.hexToByte(data.substring(130 + 2 * c2Len, 194 + 2 * c2Len));SM2 sm2 = SM2.Instance();BigInteger userD = new BigInteger(1, privateKey);//通过C1实体字节来生成ECPointECPoint c1 = sm2.ecc_curve.decodePoint(c1Bytes);Cipher cipher = new Cipher();cipher.Init_dec(userD, c1);cipher.Decrypt(c2);cipher.Dofinal(c3);//返回解密结果return c2;}public static void main(String[] args) throws Exception {for (int i = 0; i < 200; i++) {//生成密钥对Map<String, String> keyMap = generateKeyPair();String plainText = "{"id":"123","name":"张三"}";加密密钥String publicKey = keyMap.get("publicKey");//解密蜜月String privateKey = keyMap.get("privateKey");String encString = SM2Utils.encrypt(SecurityUtils.hexStringToBytes(publicKey), plainText.getBytes());System.out.println("密文:" + encString);byte[] plainString = SM2Utils.decrypt(SecurityUtils.hexStringToBytes(privateKey), SecurityUtils.hexStringToBytes(encString));System.out.println(new String(plainString));}}
}
/*** @author SongWei* @version 1.0.0* @ClassName spring-cloud.com.boot.cloud.sm.Sm2Tool.java* @Description TODO* @createTime 2018年10月28日 14:29:00*/
public class Sm2Tool {/*** 正式参数** @Version: 1.0.0* @date: 2018年10月28日 14:29:00*/public static String[] ecc_param = {"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF","FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC","28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93","FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123","32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7","BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"};public static Sm2Tool Instance() {return new Sm2Tool();}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 ECPoint ecc_point_g;public final ECDomainParameters ecc_bc_spec;public final ECKeyPairGenerator ecc_key_pair_generator;public final ECFieldElement ecc_gx_fieldsmen;public final ECFieldElement ecc_gy_fieldsmen;public Sm2Tool() {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_gx_fieldsmen = new Fp(this.ecc_p, this.ecc_gx);this.ecc_gy_fieldsmen = new Fp(this.ecc_p, this.ecc_gy);this.ecc_curve = new ECCurve.Fp(this.ecc_p, this.ecc_a, this.ecc_b);this.ecc_point_g = new ECPoint.Fp(this.ecc_curve, this.ecc_gx_fieldsmen, this.ecc_gy_fieldsmen);this.ecc_bc_spec = new ECDomainParameters(this.ecc_curve, this.ecc_point_g, this.ecc_n);ECKeyGenerationParameters ecc_engender;ecc_engender = new ECKeyGenerationParameters(this.ecc_bc_spec, new SecureRandom());this.ecc_key_pair_generator = new ECKeyPairGenerator();this.ecc_key_pair_generator.init(ecc_engender);}
}
此文章是SM2加解密代码,后续更新SM3和其他工具类(后续更新完整SM2代码)
Java实现SM2算法(国密算法)相关推荐
- 国密算法java源码_国密算法SM2证书制作
前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...
- 安全算法 - 国密算法
国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4,SM7, SM9. 国密算法分类 国家标准官方网站如下:http://openstd.samr.gov.cn/bzgk/gb/ ...
- SM2 (国密算法)实例
SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法. 随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威 ...
- Delphi SM2/SM4国密算法
最近忙个医保平台的项目,涉及SM2/SM4的签名,验签,加密,解密的业务操作过程.毕竟现在用Delpih的人不是很多,懂这方面的技术的人也更少,能涉及密码算法的少之更少,网上也能搜到一些开源的代码,也 ...
- Java笔记-SM2(国密2)的调用及SM2、SM3、SM4使用场景
注意:本博文仅仅说明SM2的使用,应用场景等,不研究其算法. SM2是非对称加密算法,对应应用层程序员来说,使用逻辑和RSA一样. 他的最主要的功能: ①非对称加密: ②签名和验签 对于应用层程序员来 ...
- ec java sm2证书_国密算法SM2证书制作
前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...
- 国密算法SM2证书制作
原文链接:http://www.jonllen.com/jonllen/work/162.aspx 国密算法SM2证书制作 分类:工作 大中小 前段时间将系统的RSA算法全部升级为SM2国密算法,密码 ...
- 浅谈国密算法 SM1、SM2、SM3、SM4
浅谈国密算法 国密算法是我国自主研发创新的一套数据加密处理系列算法.从SM1-SM4分别实现了对称.非对称.摘要等算法功能.特别适合应用于嵌入式物联网等相关领域,完成身份认证和数据加解密等功能.当然, ...
- 国密算法 SM2公钥密码 SM3杂凑算法 SM4分组密码 python代码完整实现
包含SM2公钥密码.SM3杂凑算法和SM4分组密码的国密算法完整工具包完成了.此前分别发布过上述三个算法的代码: SM2:国密算法 SM2 公钥加密 非对称加密 数字签名 密钥协商 python实现完 ...
- GmSSL制作国密算法自签证书和 HTTPS 配置
GmSSL 是一个开源(遵循 BSD 协议)的密码工具箱,支持 SM2 / SM3 / SM4 / SM9 / ZUC 等国密(国家商用密码)算法.SM2 国密数字证书及基于 SM2 证书的 SSL ...
最新文章
- nsq php,Nsq从入门到实践
- android+p+华为手机,给1.9亿用户32款老机型进行安卓P升级 华为值吗?
- 客户主数据冻结与删除标记位汇总
- 【算法】ROI Align 原理
- Java程序员须知:分布式微服务为什么很难?
- SAP Cloud for Customer Lead OData服务的ETAG字段
- block与inline,inline和inline-block,块级和行内元素,行内替换和行内非替换元素
- java for index_Java IBarDataSet.getEntryForIndex方法代码示例
- 宁德时代811电芯初现真容 搭配宝马X1混动汽车能量密度提升近6成
- android开发标签栏应该设置多少,Android开发笔记(十九)底部标签栏TabBar
- java浮点运算很难_关于Java:浮点运算不能产生精确结果
- Python:保存文件npy格式
- 忘记了Excel工作表保护密码的解决办法
- 启用特殊池解读 0x000000c5 蓝屏
- 速算扣除法php,关于速算扣除数法的计税方法 这两点必须知道
- 揭开LiteOS的神秘面纱
- Gym - 101350I - Mirrored String II (马拉车)
- java 面试题合集_撩课-Java面试题合辑1-50题
- 数据挖掘从入门到放弃:线性回归和逻辑回归
- java设置小数点格式_java指定小数点后位数格式
热门文章
- 如何在线查看.mmap格式文件
- 福利福利!20行代码教大家抓取斗鱼美女主播封面
- AutoAnswer使用指南(QQ、微信自动接听)
- c语言起点到目的地方法数,最短路径动态规划问题及C语言实现探讨
- 物业费管理系统c语言作业,c语言物业管理系统.doc
- Minitab Express 1.5 for Mac 完美版 数据分析工具
- 信息收集端口扫描工具masscan
- MySQL几种常见的数据类型
- 乌班图服务器系统升级,快速从Ubuntu 20.10升级到Ubuntu 21.04的方法
- python selenium文件下载