外观主题
阅读语言

SM4Kit —— 一套 SM4 组件,8 种语言,同一套标准测试向量

软件 本站软件 1天前 更新于 21小时前
https://yxp.hk/p/DeTI6d

📦 开源仓库:yxpil/SM4Kit · MIT License · CI 8 语言全绿

gh-card · yxpil/SM4Kit

📦 仓库名片 · Powered by gh-card

SM4Kit —— 一套 SM4 组件,8 种语言,同一套标准测试向量

SM4 是我国《GB/T 32907-2016》规定的分组密码(128 位分组 / 128 位密钥 / 32 轮),在国密体系里担当 AES 的角色。SM4Kit 把它做成了一套可以直接拷走单文件就用的多语言组件库:

语言 目录 自测命令
JavaScript / TypeScript javascript/ node sm4.js
Python python/ python sm4_kit.py
Go go/ go run .
Java java/ javac SM4.java && java SM4
Rust rust/ cargo test --release
PHP php/ php sm4.php
Ruby ruby/ ruby sm4.rb
C c/ gcc -O2 -o sm4_test sm4.c test_main.c && ./sm4_test

特点

  • 零依赖:每种实现只用标准库 / 纯语言,npm、pip、gem、composer 都不用装,单文件拷进项目即用
  • 统一 API:ECB / CBC + PKCS7,八种语言的函数一一对应,跨语言加解密互通
  • 标准可验证:内置 GB/T 32907-2016 附录 A 两个标准向量——单块密文 681edf34…4246,以及同一密钥连续加密 100 万次得到 595298c7…3f66 的"长跑"向量;GitHub Actions 8 语言矩阵 CI 全绿
  • 源自生产:核心抽自本站密钥封存模块(SM4-CBC 内层 + AES-GCM 外层的 ENC2 信封)里经过实战的那份纯 JS SM4 实现

快速体验(Python 为例)

import os
from sm4_kit import cbc_encrypt, cbc_decrypt

key, iv = os.urandom(16), os.urandom(16)
ct = cbc_encrypt(key, iv, "你好,SM4".encode())
pt = cbc_decrypt(key, iv, ct)   # -> 你好,SM4

安全边界

只做机密性(加密),不含消息认证码;需要防篡改请组合 HMAC / SM3 或 AEAD。ECB 不建议用于生产。密钥与 IV 请使用密码学安全随机源,IV 每次加密都应更换。

仓库:github.com/yxpil/SM4Kit,欢迎 Star 与提 Issue。

🛠 技术栈与开发

  • 算法层:SM4 32 轮(S 盒 + CK 常量按公式生成),ECB / CBC 模式 + PKCS7 填充
  • 8 语言实现全部零依赖:JS(附 .d.ts 类型定义与浏览器 UMD 双端)、Python、Go、Java、Rust(crate 形式)、PHP、Ruby、C(sm4.h 单头文件接口,malloc 返回 + err 指针报错)
  • 质量保障:每份实现内置 GB/T 32907 附录 A 两个标准向量自测(含 100 万次迭代长跑向量);GitHub Actions 8 语言矩阵 CI + 跨语言密文互验
  • 来源:核心抽自本站生产环境密钥封存模块(SM4-CBC 内层 + AES-GCM 外层 ENC2 信封)中经过实战的纯 JS SM4 实现

📚 文档与链接

  • 仓库:https://github.com/yxpil/SM4Kit · README「语言与用法」章节含全部 8 种语言的最小示例
  • 各语言自测:node sm4.js / python sm4_kit.py / go run . / cargo test --release / php sm4.php / ruby sm4.rb 等,追 --long 跑百万次迭代向量