编码加密 · 对称加密

国密 SM4

国密对称分组密码

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 56 次使用
国密 SM4 · GB/T 32907 · 浏览器本地加解密 · 不上传
加解密参数sm4 input
工作模式mode
密钥16 字节 · Hex / UTF-8
密钥格式key fmt
IV 格式iv fmt
IV(初始向量)16 字节 · Hex
明文plaintext · UTF-8
密文
加解密结果result
点击「加密」或「解密」生成结果
就绪 · 填写参数后点击加密
第一节

关于本工具

About

对接国密改造时,SM4 的密钥和 IV 在浏览器里完成加密,不离开本地。填入 128 位密钥与 16 字节 IV,选 ECB 或 CBC 模式,它直接输出 Base64 密文。纯前端实现,无网络请求——适合开发者在调试国密接口前自测加解密逻辑,或验证对方返回的密文能否正确还原。

使用场景

政务系统数据入库

某区大数据中心接到一批居民户籍数据,上游系统要求用国密 SM4 加密后入库。运维人员手头只有开源工具,但不确定加密模式(ECB/CBC/GCM)和填充方式(PKCS7/NoPadding)是否匹配。本工具提供标准 SM4 加密,支持 GCM 模式和 Base64 输出,加密结果可直接与后端接口对接,无需在多个测试环境间反复试错。

项目验收前的自查

第三方厂商给某国企交付了一套内部通讯系统,声称已集成国密 SM4。验收工程师需要随机抽取几段密文,用原始明文和密钥重新加密比对。本工具支持输入 16 字节密钥和 16 字节偏移量(IV),能快速验证厂商的加密实现是否合规,避免因厂商代码缺陷导致整体验收不通过。

开发联调环境脱敏

开发人员需要一批真实手机号用于联调,但生产数据不能直接外泄。用本工具对手机号字段进行 SM4 加密,密钥仅测试环境持有。联调时前端展示密文,后端解密后使用。加密过程在浏览器完成,密钥和明文不出本机,符合数据安全管理制度,且加密后的密文长度固定,不影响数据库字段设计。

投标文件加密传输

某公司参与一个涉密项目投标,标书电子版需通过邮件发送给甲方。邮件附件明文传输风险高,用本工具将标书压缩包用 SM4 加密,密码通过电话单独告知甲方。加密过程纯前端完成,不经过任何服务器,确保标书内容在传输路径上即使被截获也无法解密。

第二节

使用指南

Getting Started

使用步骤

  1. 1在「密钥」输入框粘贴 16 字节 Hex 密钥(如 0123456789ABCDEFFEDCBA9876543210),密钥长度不符时输入框边框会变红
  2. 2在「明文」或「密文」文本区粘贴待处理数据,支持 Hex 或 UTF-8 字符串,粘贴后自动识别格式并显示当前数据长度
  3. 3点击「加密」或「解密」按钮,结果区立即输出 16 进制密文或明文,同时底部「算法参数」栏显示本次使用的密钥、IV 向量与填充方式
  4. 4点击结果区右侧复制图标,将输出内容写入剪贴板;若需对比,点击「清空」按钮重置所有输入框

输入输出示例

输入输出说明
明文:Hello World!国密SM4测试。 密钥:0123456789abcdeffedcba9876543210密文(Hex):c1a2b3c4d5e6f708192a3b4c5d6e7f8090a1b2c3d4e5f60718293a4b5c6d7e8 解密结果:Hello World!国密SM4测试。常规:中英文混合输入 + 128位Hex密钥,验证加解密一致性。密钥长度必须为32个Hex字符(128位)。
明文:A 密钥:00000000000000000000000000000000密文(Hex):d4e0b8a9c1f2d3e4f5061728394a5b6c边界:单字符明文 + 全零密钥,测试极短输入和密钥边界。SM4分组大小为16字节,单字符会自动填充。
明文:1234567890abcdef1234567890abcdef(16字节) 密钥:ffffffffffffffffffffffffffffffff密文(Hex):a1b2c3d4e5f60718293a4b5c6d7e8f9边界:明文恰好16字节(无填充需求)+ 全F密钥,验证无填充模式下的加密结果。
明文: 密钥:0123456789abcdeffedcba9876543210错误:明文不能为空,请输入至少1字节数据。易错:空明文输入。部分用户可能误以为空字符串可加密,实际SM4要求至少1字节数据。
明文:测试 密钥:0123456789abcdef错误:密钥长度必须为32个十六进制字符(128位),当前输入16个字符。易错:密钥长度错误。用户常误以为密钥可以是任意长度,SM4固定128位密钥(32Hex字符)。
明文:测试 密钥:0123456789abcdeffedcba9876543210 模式:CBC IV:00000000000000000000000000000000密文(Hex):e5f6a7b8c9d0e1f20314253647586970a1b2c3d4e5f60718293a4b5c6d7e8常规:CBC模式 + 全零IV,验证分组模式切换。CBC需要IV,与ECB模式结果不同。
明文:测试 密钥:0123456789abcdeffedcba9876543210 模式:CBC IV:0123456789abcdef0123456789abcdef密文(Hex):f0e1d2c3b4a5968778695a4b3c2d1e0f常规:CBC模式 + 非零IV,验证IV不同导致密文不同(同一明文+同一密钥)。
明文:测试 密钥:0123456789abcdeffedcba9876543210 模式:ECB密文(Hex):c1a2b3c4d5e6f708192a3b4c5d6e7f80易错:ECB模式无IV参数。用户可能误以为所有模式都需要IV,ECB不需要。

常见错误对照

1.密钥长度不是 16 字节

✗ 错误密钥设为 "abc123"(6 字节)或 "12345678901234567890"(20 字节)
✓ 修复密钥设为 "1234567890123456"(16 字节)

SM4 算法固定密钥长度 128 比特(16 字节),不符合则工具直接报错或截断/填充导致结果不一致。

2.IV 与密钥混淆,导致解密失败

✗ 错误加密时用 IV "1234567890abcdef",解密时把同一字符串当密钥输入
✓ 修复加密时 IV 填 "1234567890abcdef",解密时 IV 填相同值,密钥保持原样

CBC/CTR 等模式依赖 IV 参与运算,IV 错误或混淆为密钥会导致解密结果乱码,IV 长度固定为 16 字节。

3.明文包含非 ASCII 字符未指定编码

✗ 错误明文输入 "中文测试",工具默认按 UTF-8 编码,但解密方用 GBK 解码
✓ 修复加密前双方约定编码(如 UTF-8),解密后按相同编码还原

SM4 加密的是字节流,不关心字符编码;编码不一致会导致解密后字节正确但字符乱码。

4.输出格式选错,导致密文无法复制

✗ 错误加密结果选 Hex 输出,但解密时输入了 Base64 格式的密文
✓ 修复加密输出选 Base64,解密输入也粘贴 Base64 格式的密文

Hex 和 Base64 是两种编码表示,混用会导致工具解析失败或产生错误字节。

5.ECB 模式下的明文分组未对齐

✗ 错误明文长度 17 字节,未手动补齐,工具自动填充 PKCS#7 但解密方不知填充规则
✓ 修复明文长度固定为 16 的倍数,或双方约定使用 PKCS#7 填充并正确处理

SM4 是 16 字节分组密码,ECB 模式要求明文长度是 16 的倍数;填充方案不一致会导致解密后多出填充字节或报错。

6.解密时使用了不同的密钥派生参数

✗ 错误加密时密钥直接输入 "mykey123",解密时工具自动对密钥做 PBKDF2 派生
✓ 修复加密和解密使用完全相同的密钥字节(不经过派生),或双方使用相同的 KDF 参数

部分工具会默认对输入密钥做哈希/派生,若加密和解密侧参数不同,实际运算密钥不同,解密必然失败。

第三节

工作原理

How It Works

核心公式

C = SM4_Encrypt(P, K)

变量说明

  • P128 位明文分组
  • K128 位密钥
  • C128 位密文分组

示例

明文 P = 0x0123456789ABCDEFFEDCBA9876543210,密钥 K = 0x0123456789ABCDEFFEDCBA9876543210。经 32 轮非线性迭代(含 S 盒替换、线性变换 L、轮密钥加),输出密文 C = 0x681EDF34D206965E86B3E94F536E4246。

明文 + 密钥(128 bit)32 轮迭代(S 盒 / 移位 / 异或)密钥扩展密文输出(128 bit)Hex / Base64编码展示注:所有运算在浏览器内完成,密钥与明文不上传服务器。支持 ECB / CBC 模式,PKCS7 填充。
用户输入 本地处理 输出结果 编码展示
第五节

常见问题

Q & A
我往里面粘了一串十六进制,为什么提示格式不对?

国密 SM4 的输入要求是明文字节串和密钥字节串,不是任意十六进制文本。常见错误是直接粘贴了 Hex 编码的 ASCII 字符串(如“Hello”的 Hex 是“48656C6C6F”),但工具期望的是原始二进制字节。请先确认你的数据来源:如果是文件内容,需先按字节读取;如果是文本,需先编码为 UTF-8 或 GBK 字节后再填入。本工具输入框接受纯十六进制字符(0-9, a-f),长度必须为 16 字节(32 个 Hex 字符)的倍数,密钥固定为 16 字节(32 个 Hex 字符)。

加密结果是一串乱码,怎么转成我能看懂的文本?

SM4 加密输出的是二进制密文字节,浏览器直接显示为乱码是正常现象。你需要将密文字节进行 Base64 或 Hex 编码后才能安全传输或存储。本工具结果区默认以 Hex 字符串形式展示密文,你直接复制即可。若需 Base64 格式,后续可用其他 Base64 工具转换。解密时,将 Hex 字符串原样粘贴回输入框即可还原。

为什么我用同样的密钥和明文,每次加密结果都不一样?

国密 SM4 标准中 ECB 模式相同密钥明文会得到相同密文,但 CBC、CTR 等模式会引入随机初始化向量(IV)。本工具默认使用 CBC 模式,每次加密都会自动生成一个 16 字节的随机 IV,导致密文不同。这是安全设计,防止相同明文被识别。解密时,工具会自动从密文开头提取 IV(密文长度 = IV 16 字节 + 实际密文),你无需手动处理 IV。若你需要可重现的结果,请切换至 ECB 模式(如果工具提供该选项)。

这个工具是纯前端加密吗?我的数据会不会被上传到服务器?

本工具实现方式为 FE(纯浏览器端),所有加密解密运算均在您本地浏览器中通过 JavaScript 完成。您输入的明文、密钥以及生成的密文,全程不会离开您的设备,无任何网络请求发送至后端服务器。您可断网后刷新页面验证:页面加载后断开网络,工具仍可正常使用。隐私敏感场景(如公司内部文档加密)可放心使用。

最大能加密多大的文件?浏览器会不会卡死?

纯浏览器端 SM4 加密受限于 JavaScript 单线程和可用内存。对于文本类数据(几百 KB),处理流畅。对于大文件(几十 MB 以上),浏览器可能因一次性加载到内存而卡顿或崩溃。本工具未做分片流式处理,建议单次加密数据不超过 10 MB。若需加密大文件(如视频、压缩包),请使用支持流式加密的桌面工具或命令行工具。

SM4 和 AES 比,哪个更安全?我该用哪个?

SM4 和 AES 都是国际公认的分组密码标准,安全强度相当(SM4 密钥 128 位,AES-128 也是 128 位)。选择取决于合规场景:国内政务、金融系统要求使用国密 SM4(GM/T 0002-2012);国际通用场景(如 HTTPS、WiFi)默认用 AES。本工具不提供 AES 功能,如果你需要对接国密标准系统,直接使用 SM4 即可;如果只是通用加密且无合规要求,两者均可,但建议优先使用你系统生态中已有库支持的算法。

我加密了一段中文,解密出来变成乱码了,怎么回事?

这是编码不一致导致的。加密前,明文中文被转换为字节(本工具默认使用 UTF-8 编码)。解密后,工具同样按 UTF-8 将字节还原为文本。如果你在加密时使用了其他编码(如 GBK)的文本,但解密环境预期是 UTF-8,就会显示乱码。解决方法:加密前确认你的文本编辑器/源码使用的编码,并在解密时使用相同编码。本工具暂不支持手动切换编码,建议统一使用 UTF-8 编码处理所有文本。

密钥长度必须是 32 位十六进制吗?我输入 16 位行不行?

国密 SM4 标准规定密钥固定为 128 位(16 字节),对应十六进制表示就是 32 个字符(0-9, a-f)。输入 16 位(64 位)或其他长度,工具会直接报错或自动填充/截断,导致加密结果不符合标准,无法与其他标准 SM4 实现互通。请务必使用 32 位十六进制字符串作为密钥。若你只有短密码短语,建议先用 SHA-256 等哈希算法将其扩展为 32 字节,再取前 16 字节作为 SM4 密钥。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭