国密算法工具-SmUtil

介绍

Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。

国密算法工具封装包括:

国密算法需要引入Bouncy Castle库的依赖。

使用

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.16</version>
</dependency>

引入Bouncy Castle依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.69</version>
</dependency>Copy to clipboardErrorCopied

说明 bcprov-jdk15to18的版本请前往Maven中央库搜索,查找对应JDK的最新版本。

非对称加密SM2

  1. 使用随机生成的密钥对加密或解密
String text = "我是一段测试aaaa";SM2 sm2 = SmUtil.sm2();
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));Copy to clipboardErrorCopied
  1. 使用自定义密钥对加密或解密
String text = "我是一段测试aaaa";KeyPair pair = SecureUtil.generateKeyPair("SM2");
byte[] privateKey = pair.getPrivate().getEncoded();
byte[] publicKey = pair.getPublic().getEncoded();SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));Copy to clipboardErrorCopied
  1. SM2签名和验签
String content = "我是Hanley.";
final SM2 sm2 = SmUtil.sm2();
String sign = sm2.signHex(HexUtil.encodeHexStr(content));// true
boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(content), sign);Copy to clipboardErrorCopied

当然,也可以自定义密钥对:

String content = "我是Hanley.";
KeyPair pair = SecureUtil.generateKeyPair("SM2");
final SM2 sm2 = new SM2(pair.getPrivate(), pair.getPublic());byte[] sign = sm2.sign(content.getBytes());// true
boolean verify = sm2.verify(content.getBytes(), sign);Copy to clipboardErrorCopied
  1. 使用SM2曲线点构建SM2

使用曲线点构建中的点生成和验证见:https://i.goto327.top/CryptTools/SM2.aspx?tdsourcetag=s_pctim_aiomsg

String privateKeyHex = "FAB8BBE670FAE338C9E9382B9FB6485225C11A3ECB84C938F10F20A93B6215F0";
String x = "9EF573019D9A03B16B0BE44FC8A5B4E8E098F56034C97B312282DD0B4810AFC3";
String y = "CC759673ED0FC9B9DC7E6FA38F0E2B121E02654BF37EA6B63FAF2A0D6013EADF";// 数据和ID此处使用16进制表示
String data = "434477813974bf58f94bcf760833c2b40f77a5fc360485b0b9ed1bd9682edb45";
String id = "31323334353637383132333435363738";final SM2 sm2 = new SM2(privateKeyHex, x, y);
// 生成的签名是64位
sm2.usePlainEncoding();final String sign = sm2.signHex(data, id);
// true
boolean verify = sm2.verifyHex(data, sign)Copy to clipboardErrorCopied
  1. 使用私钥D值签名
//需要签名的明文,得到明文对应的字节数组
byte[] dataBytes = "我是一段测试aaaa".getBytes();
//指定的私钥
String privateKeyHex = "1ebf8b341c695ee456fd1a41b82645724bc25d79935437d30e7e4b0a554baa5e";// 此构造从5.5.9开始可使用
final SM2 sm2 = new SM2(privateKeyHex, null, null);
sm2.usePlainEncoding();
byte[] sign = sm2.sign(dataBytes, null);Copy to clipboardErrorCopied
  1. 使用公钥Q值验证签名
//指定的公钥
String publicKeyHex ="04db9629dd33ba568e9507add5df6587a0998361a03d3321948b448c653c2c1b7056434884ab6f3d1c529501f166a336e86f045cea10dffe58aa82ea13d725363";
//需要加密的明文,得到明文对应的字节数组
byte[] dataBytes = "我是一段测试aaaa".getBytes();
//签名值
String signHex ="2881346e038d2ed706ccdd025f2b1dafa7377d5cf090134b98756fafe084dddbcdba0ab00b5348ed48025195af3f1dda29e819bb66aa9d4d088050ff148482a";final SM2 sm2 = new SM2(null, ECKeyUtil.toSm2PublicParams(publicKeyHex));
sm2.usePlainEncoding();// true
boolean verify = sm2.verify(dataBytes, HexUtil.decodeHex(signHex));Copy to clipboardErrorCopied
  1. 其他格式的密钥

在SM2算法中,密钥的格式分以下几种:

私钥:

公钥:

在新版本的Hutool中,SM2的构造方法对这几类的密钥都做了兼容,即用户无需关注密钥类型:

摘要加密算法SM3

//结果为:136ce3c86e4ed909b76082055a61586af20b4dab674732ebd4b599eef080c9be
String digestHex = SmUtil.sm3("aaaaa");Copy to clipboardErrorCopied

对称加密SM4

String content = "test中文";
SymmetricCrypto sm4 = SmUtil.sm4();String encryptHex = sm4.encryptHex(content);
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);

JavaScript

Github https://github.com/JuneAndGreen/sm-crypto

切换到 dist

下载地址

https://github.com/JuneAndGreen/sm-crypto/blob/master/dist/sm3.js

sm3("123");

更多用法参见github

国产加密算法 SM3相关推荐

  1. 【国产加密算法-java实现SM3】

    国产加密算法-java实现SM3 一.国产加密算法介绍 国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2).SM2.SM3.SM4.SM7.SM9.祖冲之密码算法(ZUC)那等等. 其 ...

  2. 一文带你学会国产加密算法SM4的vue实现方案

    前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案.没有看过的小伙伴可以看一下这篇文章. https://blog.csdn.net/hanqing456/article/details ...

  3. 一文带你学会国产加密算法SM4的java实现方案

    前言 今天给大家带来一个国产SM4加密解密算法的java后端解决方案,代码完整,可以直接使用,希望给大家带来帮助,尤其是做政府系统的开发人员,可以直接应用到项目中进行加密解密. 画重点!是SM4哦,不 ...

  4. 有没有大神知道国产加密算法SM2的详细介绍

    最好是带有详细算法的,新手求解 转载于:https://www.cnblogs.com/wangzuerha/p/5412860.html

  5. 【JS 逆向百例】医保局 SM2+SM4 国产加密算法实战

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 逆向目标 逆向过程 抓包分析 参数逆向 完整代码 JavaScript 加密关键 ...

  6. SM1 SM2 SM3 SM4加密算法

    2010 年开始,我国国家密码管理局就已经开始陆续发布了一系列国产加密算法,这其中就包括 SM1.SM2.SM3 .SM4.SM7.SM9.ZUC(祖冲之加密算法)等,SM 代表商密,即商业密码,是指 ...

  7. 爬虫逆向基础,认识 SM1/SM2/SM3/SM4/SM7/SM9/ZUC 国密算法

    文章目录 [01x00] 简介 [02x00]算法概述 [03x00]算法详解 [03x01]SM1 分组加密算法 [03x02]SM2 椭圆曲线公钥加密算法 [03x03]SM3 杂凑算法 [03x ...

  8. 最全加密算法(知识点梳理)

    一.对称密钥和非对称密钥 对称密钥(共享密钥):DES,3DES,RC5,RC4,IDEA,AES 1.DES:明文分为64位一组,密钥64位(实际位是56位的密钥和8位奇偶校验位) 2.3DES:3 ...

  9. 信息安全工程师学习笔记《第三章》

    第三章 密码学基本理论 本章讲述了密码学的基本概念以及常见的密码体制.密码算法,分析了杂凑函数.数字签名.国产密码算法.安全协议等的工作原理:本章还分析了密码在网络安全方面的应用场景类型. 3.1密码 ...

最新文章

  1. 子矩阵的最大累加和问题
  2. linux socket 详解
  3. Idea中内置Translation插件报“翻译错误”,解决方式!!!
  4. ios oc数组转换为c语言数组,iOS中将数组作为参数传递给服务器
  5. Android与Linux以及GNU的关系
  6. 数据拆分缺点和解决方案
  7. 阻塞/非阻塞/同步/异步方法和多线程的关系?没有任何关系,俩不挨着
  8. 把设备分享给每个Docker Container
  9. linux下反汇编命令,Linux命令学习手册-objdump命令
  10. 利用sklearn实现adaboost,以单一分类树为例
  11. 西门子V90电机数字量输出(DO)接倍福数字量输入模块
  12. 视频教程-毕业设计精品课之基于ASP.NET旅游网站源码实战讲解(带房屋互租模块)-.NET
  13. 金蝶KIS专业版本单据导入导出工具使用说明
  14. bitset java 源码_【JAVA】BitSet的源码研究
  15. matlab矩阵赋未知数,matlab设未知数
  16. php 下载excel文件,单独设置工作表(sheet1,sheet2,sheet3....)
  17. http url特殊字符转义
  18. 「镁客·请讲」VR的拓荒者,幻境视界让VR内容拥有艺术之美
  19. 立根铸魂 崛起数智时代 欧拉部署超300万套
  20. Python 写对联

热门文章

  1. 计算机网络dce接口命令,思科路由器里查看此接口是DCE还是DTE端的命令是什么?...
  2. 2D游戏案例:Unity答题系统(MySQL版)
  3. 干掉 IDEA:JetBrains 推出“下一代 IDE”轻量级开发工具 Fleet!
  4. Sec-WebSocket-Key
  5. 求救 VB6访问有多个反回参数的值
  6. 三星重组手机部门该如何应对中国手机的挑战?
  7. 微信小程序个人开发全过程
  8. 公考培训机构如何用自媒体短视频做招生?
  9. U盘怎么调整分区大小?u盘分区工具推荐
  10. ASPICE详细介绍-1.什么是ASPICE?