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 |
| 初始向量 IV | 7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e |
| HMAC-SM3 | RFC 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 |
