文章目录
一、SM3介绍
SM3是由中国国家密码管理局(GM/T 0004-2012)发布的密码散列算法,属于哈希函数家族。它广泛应用于数字签名、消息认证及数据完整性校验等领域,设计符合国家安全标准,具备抗碰撞性和不可逆性。
二、SM3的特点
- 抗碰撞性:基于Merkle-Damgård结构,通过复杂的布尔函数和模运算设计,SM3能够有效抵御碰撞攻击和第二原像攻击。其安全性与SHA-256相当,但算法设计更贴合中国密码学标准。
- 固定输出:输出长度为256位(32字节)。
- 高效计算:采用分组密码结构,通过消息扩展和迭代压缩实现数据混淆与扩散,兼顾安全性和计算效率。
- 国密标准:中国商用密码体系的核心算法之一。
三、如何一眼识别SM3加密?
3.1 长度判断
64位(64个字符
)十六进制字符串:可能是SM3加密
3.2 验证字符集
- 仅包含十六进制字符:确保哈希值只包含
0-9
和a-f(a、b、c、d、e、f)
。注意事项:哈希密文虽然是小写,但是别人也许会在生成后用.toUpperCase()
全部转大写。 - 无其他字符:如
g-z
、空格、特殊符号等。
3.3 搜索初始化变量
SM3初始化使用8个32位常量,初始值如下(十六进制):
IV = [
0x7380166F, 0x4914B2B9, 0x172442D7, 0xDA8A0600,
0xA96F30BC, 0x163138AA, 0xE38DEE4D, 0xB0FB0E4E
]
小技巧:可以将SM3初始化变量作为 SM3的特征值,没有魔改的情况下搜索十六进制值,如果搜不到,复制去控制台输出转换后搜索。 如果搜到了,点击进入函数内部,打上断点,重新触发断点,从堆栈(Call Stack
,堆栈运行逻辑从下往上) ,从上往下依次查看哪里调用了特征值,就可以找到加密位置。
3.4 库函数或自定义函数
如果代码中使用了SM3相关的库(如sm-crypto)或函数名包含SM3
,可确认是SM3哈希。
四、实现SM3加密
4.1 sm-crypto实现SM3加密
使用sm-crypto库实现示例:
const sm3 = require('sm-crypto').sm3;
// 待哈希的字符串
const input = "123456";
// 计算SM3哈希值(自动UTF-8编码)
const hashHex = sm3(input);
console.log("密文:", hashHex);
console.log("密文长度:", hashHex.length);
运行结果:
密文: 207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb
密文长度: 64
4.2 Python实现SM3加密
确保已经安装了 gmssl 库,可以使用以下命令进行安装:
pip install gmssl
gmssl 库实现SM3加密:
from gmssl import sm3, func
# 待哈希的字符串
input_str = "123456"
# 将字符串编码为字节类型
input_bytes = input_str.encode()
# 计算 SM3 哈希值
hash_hex = sm3.sm3_hash(func.bytes_to_list(input_bytes))
print("密文:", hash_hex)
print("密文长度:", len(hash_hex))
运行结果:
密文: 207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb
密文长度: 64