完成 SM2 的加解密与签名验签。SM2 是国密椭圆曲线公钥密码算法(GB/T 32918 / GM/T 0003),曲线为 sm2p256v1,256 位密钥的安全强度大致相当于 RSA 3072 位,而密钥更短、运算更快,国内政务、金融、电子签章类系统里普遍要求使用。这个页面可以生成密钥对,也可以导入已有的公钥私钥;加密支持 C1C3C2(国密标准)与 C1C2C3(旧实现)两种密文排列,签名支持 r 与 s 直接拼接和 DER 编码两种格式,并且可以指定 userId。所有计算都在浏览器本地完成。
工具界面在页面加载完成后显示在本段下方,可以直接使用。所有计算都在你的浏览器本地完成,输入的内容不会上传到服务器。
完成 SM2 的加解密与签名验签。SM2 是国密椭圆曲线公钥密码算法(GB/T 32918 / GM/T 0003),曲线为 sm2p256v1,256 位密钥的安全强度大致相当于 RSA 3072 位,而密钥更短、运算更快,国内政务、金融、电子签章类系统里普遍要求使用。这个页面可以生成密钥对,也可以导入已有的公钥私钥;加密支持 C1C3C2(国密标准)与 C1C2C3(旧实现)两种密文排列,签名支持 r 与 s 直接拼接和 DER 编码两种格式,并且可以指定 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 的输出长度恒等于密钥长度完全不同。页面在解密前会检查密文够不够长,太短会直接说明是复制不完整。
不能直接用。压缩格式只存 X 坐标与 Y 的奇偶性,运算前必须解压成 04 开头的未压缩点。这个页面会识别出来并明确提示,而不是拿它去算出错误结果。用 openssl 或对方系统提供未压缩公钥即可。
功能上都是「公钥加密、私钥解密;私钥签名、公钥验签」,但算法与数据格式完全不同,不能互通。选哪个主要看合规要求与对接方:国内有明确国密要求的场景用 SM2,跨境或国际系统用 RSA。
不会。SM2 的计算全部在你的浏览器里完成,没有任何网络请求,私钥也不会写进 localStorage,刷新页面就没了。