SM2 国密非对称加密与签名

完成 SM2 的加解密与签名验签。SM2 是国密椭圆曲线公钥密码算法(GB/T 32918 / GM/T 0003),曲线为 sm2p256v1,256 位密钥的安全强度大致相当于 RSA 3072 位,而密钥更短、运算更快,国内政务、金融、电子签章类系统里普遍要求使用。这个页面可以生成密钥对,也可以导入已有的公钥私钥;加密支持 C1C3C2(国密标准)与 C1C2C3(旧实现)两种密文排列,签名支持 r 与 s 直接拼接和 DER 编码两种格式,并且可以指定 userId。所有计算都在浏览器本地完成。

工具界面在页面加载完成后显示在本段下方,可以直接使用。所有计算都在你的浏览器本地完成,输入的内容不会上传到服务器。

SM2 国密非对称加密与签名能做什么

完成 SM2 的加解密与签名验签。SM2 是国密椭圆曲线公钥密码算法(GB/T 32918 / GM/T 0003),曲线为 sm2p256v1,256 位密钥的安全强度大致相当于 RSA 3072 位,而密钥更短、运算更快,国内政务、金融、电子签章类系统里普遍要求使用。这个页面可以生成密钥对,也可以导入已有的公钥私钥;加密支持 C1C3C2(国密标准)与 C1C2C3(旧实现)两种密文排列,签名支持 r 与 s 直接拼接和 DER 编码两种格式,并且可以指定 userId。所有计算都在浏览器本地完成。

怎么用SM2 国密非对称加密与签名

  1. 在「密钥对」点「生成密钥对」,会得到 130 位十六进制的公钥(04 开头)与 64 位十六进制的私钥
  2. 已有密钥就直接粘进对应输入框 —— 公钥少写 04 前缀会自动补上,压缩格式(02 / 03 开头 66 位)会被明确拒绝并说明原因
  3. 看输入框下方的提示确认解析结果;填了公私钥两把钥匙时还会校验它们是否配对
  4. 切到「加密解密」,选密文排列(默认 C1C3C2)与密文格式(Hex 或 Base64),输入明文,密文实时出现
  5. 解密时粘入密文,排列方式必须与加密方一致;点「拿去解密」可以把刚加密的结果直接带过去
  6. 签名验签在第三个 tab:私钥签名、公钥验签,两边 userId 与签名格式都要一致

示例

输入:

在「密钥对」生成一对 SM2 密钥,切到「加密解密」,密文排列 C1C3C2、密文格式 Hex,明文填「国密 SM2 加密测试」

输出:

238 位十六进制的密文(119 字节 = 明文 23 字节 + C1 64 字节 + C3 32 字节);点「拿去解密」可原样还原

SM2 加密是随机化的,同一条明文每次加密结果都不同;签名同样是随机化的 —— 每次签出不同结果但都能验过,这与 RSA 的确定性签名不同。

使用技巧与注意点

常见问题

解密出来是乱码,是不是密钥错了?

先别怀疑密钥 —— 最常见的其实是密文排列选错了。C1C3C2 与 C1C2C3 只是把 C2(正文)与 C3(摘要)的位置对调,长度完全一致,所以用错排列时底层不会报错,只会解出乱码。密钥不对时通常解出来的长度或内容更「离谱」,也可能直接失败。两种都试一次最省时间。

验签不过,但公钥肯定是对的?

检查 userId。SM2 的签名流程会把 userId 与公钥一起算进 Z 值,再参与摘要,所以 userId 是签名的一部分。默认值 1234567812345678 是国密标准规定的,但很多系统会用自己的用户标识(手机号、appId 等)。这类失败没有错误码,只是返回 false。第二常见的是签名格式:DER 与 r、s 直接拼接是两种编码,选错同样验不过。

为什么密文长度不是固定的?

SM2 是椭圆曲线加密,密文由 C1(曲线点,64 字节)、C3(32 字节摘要)和 C2(与明文等长的正文)组成,所以密文长度 = 明文长度 + 96 字节。这与 RSA 的输出长度恒等于密钥长度完全不同。页面在解密前会检查密文够不够长,太短会直接说明是复制不完整。

压缩公钥(02 / 03 开头 66 位)能用吗?

不能直接用。压缩格式只存 X 坐标与 Y 的奇偶性,运算前必须解压成 04 开头的未压缩点。这个页面会识别出来并明确提示,而不是拿它去算出错误结果。用 openssl 或对方系统提供未压缩公钥即可。

能和 RSA 互相替代吗?

功能上都是「公钥加密、私钥解密;私钥签名、公钥验签」,但算法与数据格式完全不同,不能互通。选哪个主要看合规要求与对接方:国内有明确国密要求的场景用 SM2,跨境或国际系统用 RSA。

密钥和明文会上传吗?

不会。SM2 的计算全部在你的浏览器里完成,没有任何网络请求,私钥也不会写进 localStorage,刷新页面就没了。

相关工具

同类加密与解密工具

查看全部加密与解密工具