1.概念

SM3: 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位

用于替代MD5/SHA-1/SHA-2等国际算法,适用于数字签名和验证、消息认证码的生成与验证以及随机数的生成,可以满足电子认证服务系统等应用需求,于2010年12月17日发布。

它是在SHA-256基础上改进实现的一种算法,采用Merkle-Damgard结构,消息分组长度为512bit,输出的摘要值长度为256bit。

2.算法

SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。

3.与MD5、SHA算法比较

1)、算法结构不同

在消息填充方面,几个hash算法基本相同,都是先在原始消息的最后加一位“1”,再添加k个“0”,最终要使l+1+k除以512后的余数为448,取其最小的非负整数。然后用一个64位的比特串标识原始消息的长度l。填充后的消息M正好是512位的倍数。(其中)
SM3算法的压缩函数与SHA-256的压缩函数具有相似的结构,但是SM3算法的设计更加复杂,比如压缩函数的每一轮都使用2个消息字。

2)、安全性不同

摘要函数在密码学中具有重要的地位,被广泛应用在数字签名,消息认证,数据完整性检测等领域。摘要函数通常被认为需要满足三个基本特性:碰撞稳固性,原根稳固性和第二原根稳固性。
即:

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

2005年,Wang等人给出了MD5算法和SHA-1算法的碰撞攻击方法,现今被广泛应用的MD5算法和SHA-1算法不再是安全的算法。
SM3密码摘要算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。SM3算法适用于商用密码应用中的数字签名和验证,是在SHA-256基础上改进实现的一种算法。SM3算法采用Merkle-Damgard结构,消息分组长度为512位,摘要值长度为256位。现今为止,SM3算法的安全性相对较高。

3)、效率不同

MD5、SHA1、SH2-256与SM3的对比:

4.SM3在Java中加密案例

1)、SM3工具类:SM3Util.java

package com.tom.crypto;import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;import java.util.Arrays;/*** SM3算法工具类*/
public class SM3Util {/*** 计算SM3摘要值** @param srcData 原文* @return 摘要值,对于SM3算法来说是32字节*/public static byte[] hash(byte[] srcData) {SM3Digest digest = new SM3Digest();digest.update(srcData, 0, srcData.length);byte[] hash = new byte[digest.getDigestSize()];digest.doFinal(hash, 0);return hash;}/*** 验证摘要** @param srcData 原文* @param sm3Hash 摘要值* @return 返回true标识验证成功,false标识验证失败*/public static boolean verify(byte[] srcData, byte[] sm3Hash) {byte[] newHash = hash(srcData);if (Arrays.equals(newHash, sm3Hash)) {return true;} else {return false;}}/*** 计算SM3 Mac值** @param key     key值,可以是任意长度的字节数组* @param srcData 原文* @return Mac值,对于HMac-SM3来说是32字节*/public static byte[] hmac(byte[] key, byte[] srcData) {KeyParameter keyParameter = new KeyParameter(key);SM3Digest digest = new SM3Digest();HMac mac = new HMac(digest);mac.init(keyParameter);mac.update(srcData, 0, srcData.length);byte[] result = new byte[mac.getMacSize()];mac.doFinal(result, 0);return result;}
}

2)、SM3UtilTest 工具类

package com.tom.crypto;import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Assert;
import org.junit.Test;import java.security.Security;
import java.util.Arrays;public class SM3UtilTest {static String plainText = "=========原文数据====zw!!!=====";static {Security.addProvider(new BouncyCastleProvider());}@Testpublic void testHashAndVerify() {try {byte[] hash = SM3Util.hash(plainText.getBytes("utf-8"));System.out.println("SM3 hash result:\n" + Hex.toHexString(hash));boolean flag = SM3Util.verify(plainText.getBytes("utf-8"), hash);Assert.assertTrue(flag);} catch (Exception ex) {ex.printStackTrace();Assert.fail();}}@Testpublic void testHmacSM3() {try {byte[] hmacKey = new byte[]{1, 2, 3, 4, 5, 6, 7, 8};byte[] hmac = SM3Util.hmac(hmacKey, plainText.getBytes("utf-8"));System.out.println("SM3 hash result:\n" + Arrays.toString(hmac));} catch (Exception ex) {ex.printStackTrace();Assert.fail();}}
}

国密算法使用-SM3相关推荐

  1. 国密算法 SM2 SM3 SM4 及密钥生成

    国密算法 SM2 SM3 SM4 方式一:SM2密钥在线生成 SM2密钥在线生成工具 如果你没线下生成工具,可用下面2种线上生成方式之一: 1. sm2密钥在线生成(const.net.cn) 2.  ...

  2. 国密算法介绍-SM3及摘要算法(签名算法)国际SHA-256

    一.引入 由于项目中需要用到hash算法,然而研究生以来都没有接触过真正有关密码算法的项目,今天先了解下国密算法和密码学中应用最广泛的三类算法: 1.对称算法(分组密码算法)代表分组密码算法(DES和 ...

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

    SM3简介: SM3是国产哈希算法 SM3采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布.相关标准为"GM/T 0004-2012 <SM3密码杂凑算法> ...

  4. 国密算法 SM2 SM3 SM4分别用作什么

    非对称加密SM2(可选支持国内SM9)算法实现数据的签名.验签和加解密对称密钥, SM3密码杂凑算法实现数据摘要的生成, 对称密钥SM4加密算法实现对数据内容的加密.

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

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

  6. 国密算法SM3与SM4简介与应用

    点击上方蓝字可直接关注!方便下次阅读.如果对你有帮助,麻烦点个在看或点个赞,感谢~ 最近0基础在学习国密算法的相关应用,故此和大家分享下自己的一些经历. 程序平台: Ubuntu16.04  x64 ...

  7. 国密算法(SM2,SM3,SM4)完善与算法辅助工具开发

    国密算法SM2,SM3和改名发布的SM4的应用好像越来越多了.首先是国密SM2证书的升级,国内CA服务商要完成SM2算法证书支持,之后是国密算法在金融领域进行推广,新近编订的PBOC标准的增强安全部分 ...

  8. 国密算法(SM2,SM3,SM4)辅助工具升级版(OTP+PBOC3.0)

    从编写最初版本用于SM2,SM3和SM4算法验算的辅助工具已有一年多的时间了,国密算法的应用和普及也是不温不火的.编写最初算法代码和工具时所参考的文档还非正式的国密标准文件,而目前国密标准文件发布了几 ...

  9. 国密算法分类总结:sm2,sm3,sm4等

    前面几篇博文对sm2,sm3,sm4,rsa,des等算法进行了介绍,并且用java,python语言实现了相关算法的运用. 本篇,作为一个阶段性总结,从整体上来回顾一下密码相关业务.当然,重点还是要 ...

  10. 国密算法:利用python进行sm3 hash算法,计算hash值,国密算法库gmssl的使用

    本篇介绍利用gmssl算法库中的sm3模块来进行hash值的计算. 一 sm3 hash算法的特点: sm3用于计算一个消息的hash值: 几乎无法被逆向,即通过hash值无法推断出原始消息: sm3 ...

最新文章

  1. python 字符串输入时间_Python input()函数:获取用户输入的字符串
  2. zabbix自动发现oracle表空间并监控其使用率
  3. 19. 邮件提醒(发送邮件)
  4. 【错误记录】PyCharm 运行 Python 程序报错 ( SyntaxError: Non-ASCII character ‘\xe5‘ in file x.py on line 1, but )
  5. ELF 文件 动态链接 - 地址无关代码(GOT)
  6. linux非交互式脚本,Linux expect非交互式执行脚本
  7. 收藏!一张图帮你快速建立大数据知识体系
  8. 汇编语言(二十四)之输出n行星号
  9. [C++]宏定义#define A B C
  10. DotNetNuke 4/5 安装提示 msajax错误,下载AJAX 1.0即可解决
  11. 使用carbon_东华大学《Carbon》多孔碳纳米纤维复合膜,优异电磁波吸收性能!
  12. GitHub 迎来内置 CI/CD,对所有开源项目免费!
  13. yii2基础之分页的基本使用及其配置详解
  14. centos mysql 安装_Linux下MYSQL5.7详细安装步骤:
  15. win10下如何安装.NetFrame3.5框架
  16. 在线文本比较工具-toolfk程序员在线工具网
  17. C#怎么调用MATLAB的动态链接库
  18. VMware Workstation Pro的安装详细过程
  19. 如何防止木马性图片上传
  20. 一个计算数独的小程序

热门文章

  1. kali win10双系统_小米win10+kali 双系统
  2. SAPUI5入门到精通5---MVC和数据绑定
  3. iOS xcode 9 注释快捷键
  4. 三维重建开源项目汇总
  5. python selenium打开新窗口,python selenium click打开新窗口
  6. 区块链java开源框架_github上的java三大开源区块链类库?
  7. 服务价格实惠的Andr​​oid游戏开发公司
  8. 基于PHP语言的汉语转拼音的类
  9. 微信小程序开发教程、小程序资讯、小程序demo合揖(10月16日更新)
  10. unity 创建中文自定义字体