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)\),需验证以下条件:

  1. 检查 \(r, s \in [1, n-1]\),否则拒绝。
  2. 计算 \(e' = \text{SM3}(Z_A \parallel M)\)(与签名步骤1相同)。
  3. 计算 \(t = (r + s) \bmod n\),若 \(t = 0\) 则拒绝。
  4. 计算椭圆曲线点 \((x_1', y_1') = s \cdot G + t \cdot P_A\)
  5. 验证 \(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签名实现了基于椭圆曲线的安全身份认证与不可否认性。

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签名实现了基于椭圆曲线的安全身份认证与不可否认性。