SM3简介:

  • SM3是国产哈希算法
  • SM3采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。
  • 在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。
  • 据国家密码管理局表示,其安全性及效率与SHA-256相当。
  • 消息和摘要:散列函数的输入数据,通常被称为消息(message);而它的输出结果,经常被称为消息摘要(message digest)或摘要(digest)。

密码散列函数的特点:

一个理想的密码散列函数应该有四个主要的特性:

  • 对于任何一个给定的消息,它都很容易就能运算出散列数值。
  • 难以由一个已知的散列数值,去推算出原始的消息。
  • 在不更动散列数值的前提下,修改消息内容是不可行的。
  • 对于两个不同的消息,它不能给与相同的散列数值。

SM3的工具类的实现:

可以使用bcprov和hutool两个库来分别实现。
包的引入(pom文件):

        <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.64</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency>

代码:
Sm3Tools.java:

package com.abc.smutilstest;import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;import java.io.UnsupportedEncodingException;
import cn.hutool.crypto.SmUtil;/*** SM3算法工具类*/
public class Sm3Tools {/*** sm3加密* @param text: 要加密的文本*/public static void Sm3EncryptByHutool(String text){String sm3 = SmUtil.sm3(text);System.out.println("[Sm3EncryptByHutool] hex:" + sm3);}/*** SM3加密* @param content  要加密的内容*/public static String  Sm3EncryptText(String content) throws UnsupportedEncodingException {byte[] bytes = content.getBytes();byte[] hash = hash(bytes);String sm3 = ByteUtils.toHexString(hash);System.out.println("[Sm3EncryptText]sm3 hex:" + sm3);return sm3;}public static byte[] hash(byte[] srcData){SM3Digest digest=new SM3Digest();digest.update(srcData,0,srcData.length);byte[] bytes = new byte[digest.getDigestSize()];digest.doFinal(bytes,0);return bytes;}/*** 主函数* @param args*/public static void main(String[] args) throws UnsupportedEncodingException {Sm3EncryptByHutool("abc");Sm3EncryptText("abc");}}

测试结果:

[Sm3EncryptByHutool] hex:66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
[Sm3EncryptText]sm3 hex:66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0

总结:

  • SM3适用场景:SM3密码杂凑(哈希、散列)算法适用于商用密码应用中的数字签名和验证,消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。在SM2,SM9标准中使用。
  • SM3算法对输入长度小于2的64次方的比特消息,经过填充和迭代压缩,生成长度为256比特的杂凑值,其中使用了异或,模,模加,移位,与,或,非运算,由填充,迭代过程,消息扩展和压缩函数所构成。

国密算法(SM3)java语言的实现:利用bcprov和huttol库来实现SM3算法,国产哈希算法相关推荐

  1. java语言程序设计全国考试题,2019年12月全国计算机等级考试[Java语言程序设计]复习题及答案...

    &nbsp&nbsp[导读]:2019年12月全国计算机等级考试[Java语言程序设计]复习题及答案,更多全国等级考试报名时间.考试时间以及考试模拟试题 ,请访问易考吧全国等级考试栏目 ...

  2. SM2椭圆曲线公钥密码算法的C语言实现(基于Miracl大数运算库)

    SM2椭圆曲线公钥密码算法的C语言实现(基于Miracl大数运算库) 实验环境 预备知识 FpF_pFp​ 及椭圆曲线 素域 FpF_pFp​ FpF_pFp​ 上的椭圆曲线 FpF_pFp​ 上椭圆 ...

  3. 国密算法java语言的实现:利用bcprov和hutool库分别实现国密SM4算法工具类,对称密钥

    SM4算法成为行业标准: SM4分组密码算法是2012年3月21日实施的一项行业标准: 2021年6月25日,我国SM4分组密码算法作为国际标准ISO/IEC 18033-3:2010/AMD1:20 ...

  4. 国产哈希算法WJLHA(一):开源与应用

    一.哈希算法现状 目前常见的Hash算法有MD5.SHA.MAC.CRC等.MD5信息摘要算法(MD5 Message-Digest Algorithm)[1],一种被广泛使用的密码散列算法,可以产生 ...

  5. 3. ackerman函数的递归实现算法用java语言_ackerman递归

    定义: n+1        n=0 A(m,n)={A(m-1,1) m=0 A(m-1,A(m,n-1)) n>0,m>0 #include #include using namesp ...

  6. 匈牙利算法的Java语言实现

    匈牙利算法的一个重要概念是增广路径,具体思路是对于图的每个顶点都寻找其增广路径,然后将其加入匹配顶点当中,而对于每个顶点A寻找增广路径的过程中,如果另一个顶点B和顶点A有连接且在此轮循环中没有被访问过 ...

  7. 3. ackerman函数的递归实现算法用java语言_ackerman函数递归算法

    5-2 已知 Ackerman 函 5-1 已知 A[n]为整数数组,试写出实现下列运算的递归算法: (1) 求数组 A 中的最大整数. (2) 求 n 个整数的和. (3) 求 n...... 2 ...

  8. android 国密签名,关于国密 (sm2,sm3,sm4)在Linux、python、Android、java、ios中的...

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4和最新的sm9.在国内环境主要使用的国家密码局认定的算法. SM2算法:SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法, ...

  9. 国密加密算法 java 开源_Hyperledger Fabric 国密改造项目介绍

    引言 密码学是区块链实施中最重要的组成部分之一.然而,每个国家都有自己的国家加密算法,因此,在实施联盟链方案時支持国密算法尤其重要.Hyperledger Fabric在包括中国在内的世界范围内得到广 ...

最新文章

  1. iOS 解决1。返回时的黑边问题、2。controller的抖动问题
  2. 基于图像的三维物体重建:在深度学习时代的最新技术和趋势综述之训练
  3. pandas使用str函数和contains函数查看dataframe特定数据列中是否匹配或包含特定模式的字符串(match or contain a pattern in column value)
  4. ceph-deploy mod add_我的世界基座(Pedestals)Mod
  5. Java黑皮书课后题第9章:*9.6(秒表)设计一个名为StopWatch的类,该类包含……。编写一个测试程序,用于测量使用选择排序对100000个数字进行排序的执行时间
  6. java中final的意义
  7. 最小代价(区间dp)(ybtoj)
  8. 操作系统(三)内存管理
  9. ASP.NET生成静态页面方法大全(2)
  10. linux 网口名称变了_CentOS7修改网卡名称为eth0及一些基本设置
  11. 风控算法知识——WOE值的深度理解与应用
  12. 4、elasticsearch安装head插件
  13. foobar2000 for mac(经典音乐播放器)
  14. 使用sm2签名并验签efi文件
  15. 32位win10服务器系统,微软将停止支持32位Win10系统 32位Win10系统什么时候停止支持...
  16. cobar mysql部署方案_阿里巴巴分布式数据库解决方案——Cobar中间件配置详解 (转)...
  17. excel冻结窗口_excel怎么冻结窗口?excel冻结窗口怎么设置?
  18. 腾讯云网站备案咨询:网站信息类问题汇总解答
  19. 微信公众平台开发实例 php,php微信公众平台开发类实例,php公众平台实例_PHP教程...
  20. 我们真的需要智能路由器?

热门文章

  1. oracle按年同比环比,oracle求同比,环比函数(LAG与LEAD)的详解
  2. 欧拉函数性质证明 : n所有约数的欧拉函数和等于n
  3. org.mapstruct.Mapper
  4. Scanner文本扫描器
  5. 2022年1月5日【Jiawei_Z】昆仑通态 配方组态 设计---查询/保存/编辑/导入/导出
  6. 双非二战一志愿上岸国科大杭州高等研究院经验
  7. Maven编译失败: zip file is empty
  8. 【逻辑】【java基础】查询逻辑 【实用】
  9. 腾讯地图行政区划接口调用
  10. Spring——spring单例模式的线程安全