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算法(国密算法)相关推荐

  1. 国密算法java源码_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

  2. 安全算法 - 国密算法

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4,SM7, SM9. 国密算法分类 国家标准官方网站如下:http://openstd.samr.gov.cn/bzgk/gb/ ...

  3. SM2 (国密算法)实例

    SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法. 随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威 ...

  4. Delphi SM2/SM4国密算法

    最近忙个医保平台的项目,涉及SM2/SM4的签名,验签,加密,解密的业务操作过程.毕竟现在用Delpih的人不是很多,懂这方面的技术的人也更少,能涉及密码算法的少之更少,网上也能搜到一些开源的代码,也 ...

  5. Java笔记-SM2(国密2)的调用及SM2、SM3、SM4使用场景

    注意:本博文仅仅说明SM2的使用,应用场景等,不研究其算法. SM2是非对称加密算法,对应应用层程序员来说,使用逻辑和RSA一样. 他的最主要的功能: ①非对称加密: ②签名和验签 对于应用层程序员来 ...

  6. ec java sm2证书_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

  7. 国密算法SM2证书制作

    原文链接:http://www.jonllen.com/jonllen/work/162.aspx 国密算法SM2证书制作 分类:工作 大中小 前段时间将系统的RSA算法全部升级为SM2国密算法,密码 ...

  8. 浅谈国密算法 SM1、SM2、SM3、SM4

    浅谈国密算法 国密算法是我国自主研发创新的一套数据加密处理系列算法.从SM1-SM4分别实现了对称.非对称.摘要等算法功能.特别适合应用于嵌入式物联网等相关领域,完成身份认证和数据加解密等功能.当然, ...

  9. 国密算法 SM2公钥密码 SM3杂凑算法 SM4分组密码 python代码完整实现

    包含SM2公钥密码.SM3杂凑算法和SM4分组密码的国密算法完整工具包完成了.此前分别发布过上述三个算法的代码: SM2:国密算法 SM2 公钥加密 非对称加密 数字签名 密钥协商 python实现完 ...

  10. GmSSL制作国密算法自签证书和 HTTPS 配置

    GmSSL 是一个开源(遵循 BSD 协议)的密码工具箱,支持 SM2 / SM3 / SM4 / SM9 / ZUC 等国密(国家商用密码)算法.SM2 国密数字证书及基于 SM2 证书的 SSL ...

最新文章

  1. nsq php,Nsq从入门到实践
  2. android+p+华为手机,给1.9亿用户32款老机型进行安卓P升级 华为值吗?
  3. 客户主数据冻结与删除标记位汇总
  4. 【算法】ROI Align 原理
  5. Java程序员须知:分布式微服务为什么很难?
  6. SAP Cloud for Customer Lead OData服务的ETAG字段
  7. block与inline,inline和inline-block,块级和行内元素,行内替换和行内非替换元素
  8. java for index_Java IBarDataSet.getEntryForIndex方法代码示例
  9. 宁德时代811电芯初现真容 搭配宝马X1混动汽车能量密度提升近6成
  10. android开发标签栏应该设置多少,Android开发笔记(十九)底部标签栏TabBar
  11. java浮点运算很难_关于Java:浮点运算不能产生精确结果
  12. Python:保存文件npy格式
  13. 忘记了Excel工作表保护密码的解决办法
  14. 启用特殊池解读 0x000000c5 蓝屏
  15. 速算扣除法php,关于速算扣除数法的计税方法 这两点必须知道
  16. 揭开LiteOS的神秘面纱
  17. Gym - 101350I - Mirrored String II (马拉车)
  18. java 面试题合集_撩课-Java面试题合辑1-50题
  19. 数据挖掘从入门到放弃:线性回归和逻辑回归
  20. java设置小数点格式_java指定小数点后位数格式

热门文章

  1. 如何在线查看.mmap格式文件
  2. 福利福利!20行代码教大家抓取斗鱼美女主播封面
  3. AutoAnswer使用指南(QQ、微信自动接听)
  4. c语言起点到目的地方法数,最短路径动态规划问题及C语言实现探讨
  5. 物业费管理系统c语言作业,c语言物业管理系统.doc
  6. Minitab Express 1.5 for Mac 完美版 数据分析工具
  7. 信息收集端口扫描工具masscan
  8. MySQL几种常见的数据类型
  9. 乌班图服务器系统升级,快速从Ubuntu 20.10升级到Ubuntu 21.04的方法
  10. python selenium文件下载