SM2 是国密体系里的非对称算法,作用和 RSA 一样:加密、解密、签名、验签。但它底层的数学完全不同,这也是为什么“256 位的 SM2 比 2048 位的 RSA 还安全”这句话是对的。
SM2 是国家密码管理局在 2010 年发布的椭圆曲线公钥密码算法,2016 年成为国家标准(GB/T 32918)。它属于 **ECC(椭圆曲线密码)** 家族,而不是 RSA 那样的“大整数分解”路线。
| 项目 | SM2 | RSA |
|---|---|---|
| 数学基础 | 椭圆曲线离散对数 | 大整数分解 |
| 常用密钥长度 | 256 位 | 2048 / 4096 位 |
| 安全强度对标 | 256 位 ≈ RSA 3072 位 | — |
| 密钥体积 | 小(几十字节) | 大(几百字节) |
| 运算速度 | 快 | 慢 |
| 标准来源 | 中国国密标准 | 美国/国际标准 |
密钥更短、运算更快、强度更高——这是椭圆曲线算法的普遍优势,SM2 和 ECDSA(比特币用的那个)是同一类。
因为攻击难度不同。破解 RSA 需要分解大整数,最好的算法(数域筛法)复杂度是亚指数级;破解椭圆曲线需要解离散对数,最好的算法(Pollard rho)复杂度是纯指数级。
结果是:要达到同样的安全强度,椭圆曲线需要的密钥短得多。
SM2 / ECC 256 位 ≈ RSA 3072 位
这不是“SM2 比 RSA 高级”,而是两类数学问题的性质差异。
这是使用 SM2 时最常见的困惑。SM2 公钥通常是一串十六进制,长度 130 个字符,以 04 开头:
04 || X坐标(32字节) || Y坐标(32字节)
= 1 + 32 + 32 = 65 字节 = 130 个十六进制字符
那个 04 是**未压缩点格式的标识符**,告诉解析方“后面跟的是完整的 X 和 Y 坐标”。还有一种压缩格式用 02/03 开头,只存 X 坐标和 Y 的奇偶性,用在带宽敏感的场景。
私钥则是 32 字节(64 个十六进制字符),是一个大整数。
| 项目 | 长度 | 格式 |
|---|---|---|
| 公钥 | 130 hex 字符 | 04 开头,未压缩 |
| 私钥 | 64 hex 字符 | 纯十六进制大整数 |
04 即可,或者确认对方用的是压缩格式。SM2 同时支持两种用途,密钥用途不同但格式相同:
用**对方公钥**加密,对方用**自己私钥**解密。语义和 RSA 一致。
SM2 加密有一个特点:**每次加密结果都不同**,因为内部引入了随机数。这是安全设计,不是问题。
用自己的**私钥**对数据签名,对方用你的**公钥**验证。
SM2 签名比 RSA 多一个参数:**用户 ID(默认 1234567812345678)**。这是 SM2 特有的设计,签名时把这个 ID 和公钥一起参与计算。如果双方 ID 不一致,验签会失败——这是国密对接时一个非常隐蔽的坑。
和 RSA+AES 的组合完全对应:
| 用途 | 国际算法 | 国密算法 |
|---|---|---|
| 对称加密大流量 | AES | SM4 |
| 密钥交换/签名 | RSA / ECDSA | SM2 |
| 完整性校验 | SHA-256 | SM3 |
实际系统里是三者配合:SM2 传递 SM4 密钥,SM4 加密业务数据,SM3 做摘要和签名。整套国密改造就是把这三种算法替换进去。
全部在浏览器本地计算,密钥不会上传。
1234567812345678,但很多系统会改成别的);签名数据被转码过(Base64 和 hex 混用);公钥少了 04 前缀;签名值 r/s 拼接顺序不同。国密对接失败基本出在这四项。