五岁小站 - 免费在线工具箱

加载中...

SM3 国密哈希

国密 SM3 杂凑算法 · 严格遵循 GB/T 32905-2016 / GM/T 0004-2012 商用密码标准 · 256 位输出 · 64 个 Hex 字符 · 64 轮压缩函数
字符数: 0 | 字节数: 0
长度: 0 字符
常用配置模板
代码示例(SM3 / HMAC-SM3)
// 推荐使用 sm-crypto
const sm3 = require('sm-crypto').sm3;

// 1) 标准 SM3 哈希
const hash = sm3('hello 国密');
// => 64 个 Hex 字符

// 2) HMAC-SM3 (API 签名)
const mac = sm3('hello 国密', {
    mode: 'hmac',
    key:  'mySecretKey'        // 字符串或 Hex 数组均可
});

// 3) GB/T 32905 测试向量
console.log(sm3('abc'));
// 期望: 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
// 使用 BouncyCastle (org.bouncycastle:bcprov-jdk15on)
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;

public static byte[] sm3(byte[] data) {
    SM3Digest d = new SM3Digest();
    d.update(data, 0, data.length);
    byte[] out = new byte[d.getDigestSize()];
    d.doFinal(out, 0);
    return out;     // 32 字节
}

public static byte[] hmacSm3(byte[] key, byte[] msg) {
    HMac mac = new HMac(new SM3Digest());
    mac.init(new KeyParameter(key));
    mac.update(msg, 0, msg.length);
    byte[] out = new byte[mac.getMacSize()];
    mac.doFinal(out, 0);
    return out;
}
# pip install gmssl
from gmssl.sm3 import sm3_hash, sm3_kdf
import binascii

# 标准 SM3
def sm3_hex(data: bytes) -> str:
    return sm3_hash(list(data))

print(sm3_hex(b'abc'))
# 期望: 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0

# HMAC-SM3 需自行实现或使用 cryptography 库的 HMAC + SM3 hash 接口
package main

import (
    "encoding/hex"
    "fmt"

    "github.com/tjfoc/gmsm/sm3"
)

func main() {
    h := sm3.New()
    h.Write([]byte("hello"))
    sum := h.Sum(nil)
    fmt.Println(hex.EncodeToString(sum))

    // HMAC-SM3
    // import "crypto/hmac"
    // mac := hmac.New(sm3.New, []byte("key"))
    // mac.Write([]byte("hello"))
    // fmt.Println(hex.EncodeToString(mac.Sum(nil)))
}
// composer require lpilp/php-sm2
use Lpilp\Phpsm2sm3sm4\sm3;

$hash = sm3::encrypt('hello 国密');   // 64 Hex 字符
SM3 算法说明
参数 说明
标准GB/T 32905-2016 / GM/T 0004-2012 国家密码管理局
输出长度256 位 (32 字节, 64 Hex 字符)
分组长度512 位 (64 字节)
压缩函数64 轮,使用布尔函数 FF / GG 与置换函数 P0 / P1
初始向量 IV7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
HMAC-SM3RFC 2104 规范:MAC = SM3((K xor opad) ‖ SM3((K xor ipad) ‖ M)),输出 32 字节
典型应用SM2 数字签名摘要、电子签章、口令存储、API 签名(HMAC)、文件指纹、区块链摘要
GB/T 32905-2016 标准测试向量
输入预期 SM3 值
"abc" (3 字节)66c7f0f4 62eeedd9 d1f2d46b dc10e4e2 4167c487 5cf2f7a2 297da02b 8f4ba8e0
"abcd" 重复 16 次 (64 字节)debe9ff9 2275b8a1 38604889 c18e5a4d 6fdb70e5 387e5765 293dcba3 9c0c5732
空字符串 "" (0 字节)1ab21d83 55cfa17f 8e611948 31e81a8f 22bec8c7 28fefb74 7ed035eb 5082aa2b