ECDSA算法
以下是对 ECDSA(椭圆曲线数字签名算法,Elliptic Curve Digital Signature Algorithm)生成数字签名的介绍。
ECDSA 算法生成数字签名¶
ECDSA 是一种基于椭圆曲线密码学(ECC)的数字签名算法,广泛应用于区块链(如比特币、以太坊)和其他安全系统中。它通过私钥生成签名,并用对应的公钥验证签名,以确保数据的完整性和发送者的身份。以下是 ECDSA 生成数字签名的详细过程。
前提条件¶
在生成签名之前,需要以下参数: - 椭圆曲线参数:包括曲线方程(例如 secp256k1)、基点 ( G )、阶 ( n )、有限域 ( p ) 等。 - 私钥 ( d ):一个随机选择的整数,满足 ( 0 < d < n )。 - 公钥 ( Q ):通过椭圆曲线点乘计算 ( Q = d \cdot G )。 - 消息 ( m ):需要签名的数据(通常是消息的哈希值,例如用 SHA-256 计算得到的 ( z ))。
生成数字签名的步骤¶
ECDSA 的签名是一个由两个值组成的对 ( (r, s) )。以下是生成过程:
- 计算消息的哈希值
对消息 ( m ) 使用哈希函数(例如 SHA-256)计算哈希值 ( h )。
取 ( h ) 的前 ( n ) 位(若 ( h ) 比特长度大于 ( n )),记为 ( z )。
- 选择随机数 ( k )
随机生成一个介于 ( 1 ) 和 ( n-1 ) 之间的整数 ( k ),称为临时密钥(nonce)。
注意:( k ) 必须是随机的且不可重复,否则可能泄露私钥。
- 计算椭圆曲线点 ( (x_1, y_1) )
使用椭圆曲线点乘计算 ( (x_1, y_1) = k \cdot G )。
其中 ( G ) 是基点,( k \cdot G ) 是标量乘法。
- 计算 ( r )
取 ( x_1 ) 对阶 ( n ) 取模:
( r = x_1 \mod n )。
如果 ( r = 0 ),返回步骤 2 重新选择 ( k )。
-
计算 ( s )
使用以下公式计算 ( s ):
( s = k^{-1} \cdot (z + r \cdot d) \mod n )。
其中: -
( k^{-1} ) 是 ( k ) 在模 ( n ) 下的乘法逆(即 ( k \cdot k^{-1} \equiv 1 \mod n ))。
- ( z ) 是消息哈希值。
- ( d ) 是私钥。
如果 ( s = 0 ),返回步骤 2 重新选择 ( k )。
- 输出签名
最终数字签名是 ( (r, s) )。
签名验证(简要说明)¶
接收方使用公钥 ( Q ) 验证签名 ( (r, s) ) 是否有效: - 计算 ( u_1 = z \cdot s^{-1} \mod n ) 和 ( u_2 = r \cdot s^{-1} \mod n )。 - 计算点 ( (x', y') = u_1 \cdot G + u_2 \cdot Q )。 - 如果 ( x' \mod n = r ),则签名有效。
数学基础¶
ECDSA 基于椭圆曲线上的离散对数问题(ECDLP),即给定 ( Q = d \cdot G ),很难反推出 ( d )。
示例(简化)¶
假设: - 私钥 ( d = 7 ) - 基点 ( G ) 和曲线参数已定义 - 消息哈希 ( z = 10 ) - 随机数 ( k = 5 )
计算: 1. ( (x_1, y_1) = 5 \cdot G )(假设 ( x_1 = 15 ))。 2. ( r = 15 \mod n )(假设 ( n = 23 ),则 ( r = 15 ))。 3. ( s = k^{-1} \cdot (z + r \cdot d) \mod n = 5^{-1} \cdot (10 + 15 \cdot 7) \mod 23 )。 - ( 5^{-1} \mod 23 = 14 )(因为 ( 5 \cdot 14 = 70 \equiv 1 \mod 23 ))。 - ( z + r \cdot d = 10 + 15 \cdot 7 = 115 )。 - ( s = 14 \cdot 115 \mod 23 = 14 \cdot 2 = 28 \mod 23 = 5 )。
签名结果:( (15, 5) )。
注意事项¶
- 随机性:( k ) 必须每次不同且不可预测,否则私钥可能被逆向推导(例如 Sony PS3 签名漏洞)。
- 安全性:依赖椭圆曲线参数的选择(如 secp256k1)。
以上是 ECDSA 生成数字签名的完整介绍,使用 Markdown 格式编写,你可以直接复制使用。如果需要更具体的代码示例或某个步骤的深入解释,请告诉我!