SM2椭圆曲线公钥密码算法的数字签名过程
字数 1639 2025-11-02 19:16:02
SM2椭圆曲线公钥密码算法的数字签名过程
SM2是中国国家密码管理局发布的椭圆曲线公钥密码算法标准,其数字签名过程基于椭圆曲线离散对数问题(ECDLP)的困难性。下面逐步讲解签名生成与验证的细节。
1. 参数准备
SM2签名使用以下公共参数:
- 椭圆曲线方程:\(y^2 = x^3 + ax + b\)(通常为素域上的曲线,如SM2标准曲线)。
- 基点 \(G\),阶为素数 \(n\)。
- 用户私钥 \(d_A\)(随机整数,\(1 \leq d_A \leq n-1\)),公钥 \(P_A = d_A \cdot G\)。
- 哈希函数:SM3杂凑算法。
2. 签名生成过程
假设签名者对消息 \(M\) 进行签名,步骤如下:
步骤1:计算哈希值 \(e\)
- 将消息 \(M\) 与用户公钥 \(P_A\) 的坐标及其他参数拼接(具体格式见标准),输入SM3哈希函数:
\[ e = \text{SM3}(Z_A \parallel M) \]
其中 \(Z_A\) 是用户身份标识与曲线参数的哈希值(用于绑定身份)。
步骤2:生成随机数 \(k\)
- 随机选择 \(k \in [1, n-1]\),必须保证随机性且每次签名不同,否则私钥可能泄露。
步骤3:计算椭圆曲线点 \((x_1, y_1)\)
- 计算 \(k \cdot G = (x_1, y_1)\),取 \(x_1\) 的整数形式。
步骤4:计算 \(r\)
- \(r = (e + x_1) \bmod n\)。
- 若 \(r = 0\) 或 \(r + k = n\),则返回步骤2重新生成 \(k\)。
步骤5:计算 \(s\)
- \(s = ((1 + d_A)^{-1} \cdot (k - r \cdot d_A)) \bmod n\)。
- 若 \(s = 0\),则返回步骤2。
最终签名为 \((r, s)\)。
3. 签名验证过程
验证者已知公钥 \(P_A\)、消息 \(M\) 和签名 \((r, s)\),需验证以下条件:
- 检查 \(r, s \in [1, n-1]\),否则拒绝。
- 计算 \(e' = \text{SM3}(Z_A \parallel M)\)(与签名步骤1相同)。
- 计算 \(t = (r + s) \bmod n\),若 \(t = 0\) 则拒绝。
- 计算椭圆曲线点 \((x_1', y_1') = s \cdot G + t \cdot P_A\)。
- 验证 \(r = (e' + x_1') \bmod n\) 是否成立。成立则接受签名。
4. 关键安全要点
- 随机数 \(k\) 的重要性:若 \(k\) 重复或可预测,攻击者可通过两次签名推导出私钥(类似ECDSA的攻击)。
- 哈希绑定身份:\(Z_A\) 的引入防止公钥替换攻击。
- 验证中的代数一致性:
\[ s \cdot G + t \cdot P_A = s \cdot G + (r+s) \cdot d_A \cdot G = (s + (r+s)d_A) \cdot G \]
代入 \(s = (1+d_A)^{-1}(k - r d_A)\),可推导出结果等于 \(k \cdot G\),从而与签名时的 \(x_1\) 一致。
5. 与ECDSA的差异
SM2签名在计算 \(r\) 时引入哈希值 \(e\)(\(r = e + x_1 \mod n\)),而ECDSA使用 \(r = x_1 \mod n\)。这一改动增强了对某些攻击的抵抗性(如部分消息恢复攻击)。
通过以上步骤,SM2签名实现了基于椭圆曲线的安全身份认证与不可否认性。