政务系统接口对接
某软件公司接到一个政府项目,需要将内部系统的用户登录数据加密后传给政务云平台。对方要求必须使用国密 SM2 公钥加密,且密钥对由政务平台生成。开发人员用本工具生成 SM2 密钥对,并将公钥导出为 PEM 格式发给对方,同时用私钥对测试数据进行签名验签,确保接口联调时双方加解密逻辑一致,避免了因算法实现差异导致的反复返工。
甲方发来一份SM2公钥PEM文件,用OpenSSL验签报错“unknown curve”,因为国密SM2的椭圆曲线参数与标准NIST曲线不同。这个工具直接从PEM或HEX字符串解析密钥对,用Go内置的SM2实现做签名与验签——不依赖系统OpenSSL,避免曲线参数错配。所有密钥运算在服务端完成,不记录原文与签名结果。
某软件公司接到一个政府项目,需要将内部系统的用户登录数据加密后传给政务云平台。对方要求必须使用国密 SM2 公钥加密,且密钥对由政务平台生成。开发人员用本工具生成 SM2 密钥对,并将公钥导出为 PEM 格式发给对方,同时用私钥对测试数据进行签名验签,确保接口联调时双方加解密逻辑一致,避免了因算法实现差异导致的反复返工。
一家中小型律所为客户起草保密协议,需要双方在线签署。传统做法是将 PDF 打印盖章再扫描,但客户要求使用电子签章且符合《电子签名法》。律所法务用本工具将协议原文做 SM2 签名,生成签名值文件,连同公钥发给客户验证。客户导入公钥后验签通过,确认文件在传输中未被篡改,且签名者身份可追溯,整个过程无需购买第三方电子签章平台。
一家智能门锁厂商在 OTA 升级固件时,担心固件包被中间人替换导致门锁被远程破解。工程师在发版前用本工具对固件二进制文件进行 SM2 签名,并将公钥烧录在设备安全芯片中。设备每次升级前自动验签,签名不通过则拒绝刷入。本工具支持对任意二进制文件签名,不限制文件大小,且签名过程完全离线,避免私钥在联网环境中泄露。
某高校实验室与外地合作方共享基因测序数据,数据量约 2GB,涉及受试者隐私。实验室用本工具生成 SM2 密钥对,将公钥发给合作方,合作方用公钥加密数据压缩包后上传到实验室的 FTP。实验室用私钥解密,整个过程数据在传输链路中为密文状态。本工具加密结果输出为 Base64 编码,可直接嵌入 JSON 或 XML 报文,无需额外转码。
一家财务公司每天需将企业银行流水对账文件发给银行,文件包含账号和交易金额。银行要求使用国密 SM2 公钥加密,且密钥每季度更换。财务人员用本工具将 CSV 文件内容复制到输入框,粘贴银行提供的公钥,点击加密后将密文粘贴到邮件正文发送。本工具支持 GBK 和 UTF-8 编码,确保中文账户名在加密前后不乱码。
| 输入 | 输出 | 说明 |
|---|---|---|
| 明文:hello 国密 私钥:MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg...(PEM格式) | 密文:MEYCIQDSs7X...(Base64编码的ASN.1结构) | 常规:中英文混合输入,验证SM2对UTF-8字符的加密能力,输出为C1C3C2格式的Base64密文 |
| 明文:1234567890abcdef 公钥:MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE...(PEM格式) | 签名:MEUCIQDSs7X...(Base64编码的DER格式) | 常规:纯数字字母输入,验证SM2签名功能,输出为(r,s)对的DER编码 |
| 明文:(空字符串) 私钥:MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg... | 错误:明文不能为空 | 边界:空字符串输入,验证工具对空值的校验逻辑,SM2标准不支持空明文加密 |
| 明文:A 私钥:MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg... | 密文:MEYCIQDSs7X...(Base64编码,长度约128字符) | 边界:单字符明文,验证SM2对极短明文的处理,输出密文长度固定(约128字节Base64) |
| 明文:这是一段超过1024字节的测试文本,重复填充...(实际粘贴2000字节) 公钥:MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE... | 错误:明文长度超过SM2单次加密上限(最大1024字节) | 边界:超长明文,SM2单次加密最大支持1024字节(含填充),超限需分段处理 |
| 明文:test 私钥:MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg...(但私钥最后一位字符被误删) | 错误:私钥格式无效,Base64解码失败 | 易错:私钥PEM格式损坏(长度不对/字符缺失),工具应给出明确错误提示而非静默失败 |
| 明文:123456 公钥:3059301306072A8648CE3D020106082A811CCF5501822D03420004...(十六进制公钥) | 错误:公钥格式不识别,请使用PEM格式(-----BEGIN PUBLIC KEY-----) | 易错:用户误传十六进制公钥,SM2工具通常只接受PEM格式,需提示正确格式 |
| 明文:hello 私钥:MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg...(正确的PEM私钥) 加密后得到密文:MEYCIQDSs7X... 再用同一私钥解密该密文 | 解密结果:hello | 常规:加密-解密闭环验证,确认同一私钥能正确还原原始明文,验证算法一致性 |
1.混淆 SM2 密钥格式:HEX 与 PEM 混用
将 PEM 格式私钥直接粘贴到要求 HEX 的输入框将 PEM 私钥通过 openssl pkey -in key.pem -outform DER | xxd -p 转为 HEX 再粘贴SM2 密钥在 Go 后端实现中常以 PEM 存储(含 -----BEGIN PRIVATE KEY----- 头),但工具输入字段要求纯十六进制字符串,混用会导致解析失败。
2.公钥未压缩格式与压缩格式混淆
输入 04 开头的 65 字节未压缩公钥,但工具只接受 02/03 开头的 33 字节压缩公钥使用 openssl ec -pubin -in pub.pem -conv_form compressed -outform DER | xxd -p 转为压缩格式再输入SM2 公钥有两种表示:未压缩(04+64字节)和压缩(02/03+32字节)。工具后端若按固定长度解析,格式不匹配会报 'invalid public key'。
3.签名时未指定用户标识符(User ID)
调用 SM2 签名时直接对消息哈希签名,未传入用户标识符签名前先拼接用户标识符(默认 '1234567812345678' 16字节)与消息,再计算 SM3 哈希后签名GB/T 32918.2-2016 规定 SM2 签名必须包含用户标识符(ZA 值),否则验证方无法正确还原 ZA,导致签名验证失败。
4.加密时使用 SM3 哈希值作为明文输入
将 SM3 摘要(32字节)直接作为 SM2 加密的明文将原始消息(如 JSON 字符串)直接作为 SM2 加密的明文SM2 加密算法本身已内嵌 KDF 和杂凑步骤,对明文无长度或格式限制。预计算哈希会引入冗余操作,且解密后得到的是哈希值而非原始消息。
5.解密时输错密钥索引或密码
使用 SM2 私钥解密时,误选到其他密钥对的索引或输入错误密码确认密钥索引与加密时使用的公钥对应,且私钥解密密码正确SM2 是非对称加密,解密必须使用与加密公钥配对的私钥。密钥索引或密码错误会导致解密结果乱码或报错 'decryption failed'。
6.签名验证时未检查签名值是否为 DER 编码
将签名值直接当作 64 字节原始 R||S 字符串输入使用 openssl pkeyutl -verify -pubin -inkey pub.pem -in msg.txt -sigfile sig.der 验证,或确保签名值为 DER 编码SM2 签名标准输出为 DER 编码的 ASN.1 SEQUENCE(含 R 和 S),而非原始 64 字节。工具若按 DER 解析,原始 R||S 会导致解析失败。
7.密钥生成后未安全保存私钥文件
将私钥以明文形式保存在公开目录或日志中私钥使用 PEM 加密存储(openssl ec -aes-256-cbc -in key.pem -out enc_key.pem),并设置 600 权限SM2 私钥泄露后,攻击者可解密所有用对应公钥加密的数据,并伪造签名。安全存储是使用非对称加密的基本前提。
SM2 签名: s = (1 + d_A)^{-1} · (k - r · d_A) mod n
d_A私钥,用户持有的秘密整数k随机数,每次签名不同r椭圆曲线点 (x1, y1) 的 x1 坐标n椭圆曲线基点 G 的阶,固定参数设私钥 d_A = 0x1234567890abcdef,随机数 k = 0xfedcba0987654321,计算得 r = 0x5a6b7c8d9e0f1a2b,n = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123。代入公式:先计算 (1 + d_A) mod n 的模逆,再计算 (k - r·d_A) mod n,相乘取模得 s = 0x3c4d5e6f7a8b9c0d。签名结果为 (r, s) 对。
SM2 非对称加密的输出是二进制数据(C1C3C2 格式),不是可读文本。工具默认将结果编码为 Base64 字符串,方便复制和传输。直接复制 Base64 结果发给对方即可,对方使用 SM2 解密时需选择对应输入格式(Base64),并确保使用正确的私钥。如果对方工具要求十六进制字符串,可在本工具输出区切换编码格式。
验证 SM2 签名需要三样:原始消息、签名值、你的公钥。本工具签名结果通常输出为 Base64 字符串。对方拿到后,使用任何 SM2 验签工具(包括本工具的验签功能),粘贴原始消息、签名值,并填入你的公钥,选择对应的签名算法(SM2 默认使用 SM3 哈希),点击验签即可。注意签名前消息的编码(UTF-8/GBK)必须与签名时一致,否则验签失败。
这是正常现象,不是工具问题。SM2 加密算法内部包含随机数(用于生成临时密钥),所以即使明文和公钥完全相同,每次加密输出的密文也不同。这种随机性是为了防止攻击者通过比对多次加密结果来推断明文信息,是密码学上的安全设计。解密时只要私钥正确,无论密文外观如何变化,都能正确恢复原始明文。
本工具首页提供密钥生成功能,点击即可生成一对 SM2 密钥。私钥是一个 256 位的随机整数,通常表示为 64 位十六进制字符串(例如 0x 开头的一串数字字母)。公钥是椭圆曲线上的一个点,由 x 和 y 坐标组成,通常表示为 04 前缀 + 128 位十六进制字符串(未压缩格式)。工具支持导出为 PEM 格式(-----BEGIN PRIVATE KEY-----),方便与 OpenSSL 等标准工具互操作。
两者都是成熟的非对称加密算法,安全性取决于密钥长度。SM2 使用 256 位椭圆曲线,提供约 128 比特安全强度,与 RSA-3072 相当。在同等安全强度下,SM2 密钥更短(256 位 vs 3072 位)、计算更快、带宽占用更小。如果你的系统需要满足国密合规(如政务、金融、等保三级),必须选 SM2。如果仅用于通用加密且无合规要求,RSA 更易与现有系统集成。
本工具支持两种私钥格式:原始十六进制字符串(64 位,不带空格或换行)和 PEM 格式(以 -----BEGIN PRIVATE KEY----- 开头)。常见错误包括:复制了带换行的 PEM 但未选择对应格式、十六进制字符串包含 0x 前缀、或私钥不是 SM2 曲线(如用了 ECDSA 的 secp256k1 密钥)。请先确认密钥来源,然后在本工具输入区正确选择格式选项。如果仍失败,可尝试将密钥粘贴到纯文本编辑器去除多余字符。
可以,只要遵循 SM2 国家标准(GM/T 0003-2012)。本工具加密输出采用标准 C1C3C2 格式,Base64 编码。其他合规 SM2 工具(如 GmSSL、OpenSSL 1.1.1+ 国密版)均可解密,但需注意:对方工具可能需要手动指定输入格式为 Base64 或十六进制,且解密时使用的私钥必须与加密时使用的公钥配对。如果对方工具默认输出格式不同(如 C1C2C3),解密会失败,此时可尝试切换本工具的输出格式。
SM2 作为公钥加密算法,直接加密的明文长度受限于椭圆曲线参数。标准 SM2 算法每次最多加密约 30-40 字节(取决于填充方式)。要加密大文件,正确做法是使用 SM2 + 对称加密的组合方案:随机生成一个 SM4 密钥,用 SM2 加密这个 SM4 密钥,再用 SM4 加密文件。本工具目前处理短文本(如密钥、密码、小段数据),对于文件加密,建议使用支持混合加密的专业工具或 SDK。
本工具采用后端实现(BE),加密/签名操作在服务器完成。传输过程使用 HTTPS 加密,但明文和密钥会短暂经过服务器内存。工具不存储任何输入输出数据,操作完成后立即丢弃。如果你处理的是高度敏感数据(如银行私钥、身份证),建议使用纯浏览器端实现的 SM2 工具(FE 模式),确保数据完全不离开本地。本页面顶部有隐私说明链接,详细描述了数据处理流程。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。