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比特的杂凑值,其中使用了异或,模,模加,移位,与,或,非运算,由填充,迭代过程,消息扩展和压缩函数所构成。