什么是椭圆曲线数字签名算法? - ECDSA

  • cyfrin
  • 发布于 2025-03-24 18:24
  • 阅读 30

这篇文章全面介绍了椭圆曲线数字签名算法(ECDSA)的基本概念及其在以太坊中的应用,讲解了公钥加密、数字签名的生成与验证过程,以及ECDSA的安全性基础。了解这些内容对于理解区块链技术中的身份验证和签名至关重要。

椭圆曲线数字签名算法是什么? - ECDSA 签名

椭圆曲线数字签名算法 (ECDSA) 基于椭圆曲线密码学 (ECC),用于生成密钥、认证、签名和验证消息。

椭圆曲线数字签名算法 (ECDSA) 基于椭圆曲线密码学 (ECC),用于生成密钥、认证、签名和验证消息。 签名在区块链技术中提供了一种身份验证手段,允许验证诸如发送交易的操作确实来自预期的签署者。但是,它们是如何工作的,以及如何创建的呢?

本文将教你密码学的基础,以理解支撑以太坊身份验证的机制:ECDSA 签名,为什么使用它们,它们是如何工作的,以及 ECDSA 在以太坊中的不同用途。

以太坊中的身份验证

在以太坊中,所有权的证明通过使用公钥和私钥对来实现,这些密钥用于创建数字签名。签名类似于从银行提取资金时需要提供个人身份证明 - 需要验证此人是账户的所有者。

这被称为 公钥密码学(非对称加密 - 稍后会详细讨论),是一种使用密钥对系统的密码方法:

  • 私钥用于签署消息,并用于导出公钥。
  • 公钥用于验证私钥。

从公钥计算出私钥是困难的(为了简单起见,可以认为这是不可能的),即使是计算机也是如此(请注意,这一假设存在例外,稍后将讨论)。这意味着 掌握私钥可以访问账户,而获取公钥则无法访问

这些公钥和私钥对定义了以太坊的外部拥有账户(EOA),并通过签署数据和发送交易提供了与区块链交互的手段,而其他人则无法访问他们不拥有的账户。以太坊地址用作身份标识,是 控制账户的公钥哈希的最后 20 字节

什么是签名?

签名在区块链技术中提供了一种密码学身份验证手段,形成唯一的“指纹”,构成了区块链交易的支柱。 它们用于验证在链下执行的计算并代表签署者授权交易。

数字签名创建过程

  • 创建签名涉及对消息进行哈希,然后使用 ECDSA 算法 将该哈希与私钥组合;这个过程称为 签名 消息。
  • 在签名消息后,会生成一个 数字签名,作为 验证 签署者确实是预期账户的手段。
  • 每个 不同的消息 生成一个唯一的哈希,产生一个相应独特的签名*。

*在考虑重放攻击时,这一点非常重要。为了防止重放,每个签名都要求是唯一的。这是通过将 nonce(“一次性使用的数字”)作为消息的一部分进行包括来实现的。在绝大多数情况下,数字签名的创建是从用户中抽象出来的,例如在 MetaMask 中签署交易时。然而,当将签名实施到智能合约时,应将nonce和链 ID等额外数据添加到消息中以防止重放。有关防止重放攻击的更多信息,请参考这篇全面指南

椭圆曲线数字签名算法是什么?

椭圆曲线数字签名算法 (ECDSA) 是一种基于椭圆曲线密码学 (ECC) 的签名算法。它是用于创建密钥并生成和验证用于身份验证的签名的密码算法。了解它的高层次运作是有用的,以便在智能合约中直接实施签名验证并理解如何确保这些智能合约的安全。

secp256k1 椭圆曲线

椭圆曲线 secp256k1 是以太坊中使用的 ECDSA 的特定曲线,因其与比特币的互操作性、效率和安全性而被选择。与所有椭圆曲线一样,它在 x 轴上是对称的。因此,对于每个 (r,s,v) 坐标(稍后将讨论其含义),存在另一个坐标返回相同的有效结果。这意味着在曲线上的任何点上,存在两个签名供一个签署者使用,允许攻击者计算第二个有效签名,而无需签署者的私钥。这可能导致签名的可塑性,这是一种重放攻击的形式。

该曲线可以可视化为:

椭圆曲线数字签名算法的曲线图

来源: SECP256k1 曲线

secp256k1 曲线具有:

  • 生成点 G 是椭圆曲线上的一个特定点:(***x*** = 55066263022277343669578718895168534326250603453777594175500187360389116729240, ***y*** = 32670510020758816978083085130507043184471273380659243275938904335757337482424)
  • 阶数 n 是由 G 生成的椭圆曲线点的子群的阶数,该阶数定义了私钥的长度(例如 256 位),且是一个质数:115792089237316195423570985008687907852837564279074904382605163141518161494337

除了了解这些常量的存在及其在后续计算中的使用外,理解其含义并非关键。

ECDSA 签名解释

以太坊 ECDSA 签名包含三个整数:rsv。签名可以表示为 (r, s, v)

  • r(范围在 [1...n-1] 之间的整数):表示基于曲线随机点 R 的 x 坐标。
  • s(范围在 [1...n-1] 之间的整数):作为签署者知晓私钥 p 的证据。 s 是使用随机唯一 nonce k 计算的,确保签名每次都是唯一的。
  • v 用于 恢复公钥r 的值,并表示用于签名的椭圆曲线上的点的索引。恢复过程会生成多个可能的 R 值。添加 v 后,指明需要哪个解决方案。

有关 ECDSA 签名的更多信息,请访问 开发者实用密码学文档

以太坊中的椭圆曲线数字签名算法

在以太坊中,ECDSA 用于以下几项:

  1. 密钥生成
  2. 签名消息
  3. 签名验证

让我们更详细地讨论每项的运作方式:

1. ECDSA 密钥生成 - 公钥和私钥是如何创建的?

一个 ECDSA 密钥对 由以下内容组成:

  • 一个 私钥(整数)p:作为范围 [0…n-1] 内的一个随机整数生成。
  • 一个 公钥(EC 点):椭圆曲线上的一个点 pubKey = p * G
椭圆曲线离散对数问题 (ECDLP) - ECDSA 如何确保安全?

签名( r, s, v) 保护私钥,得益于椭圆曲线离散对数问题 (ECDLP) 的复杂性。此问题涉及找到一个整数 p (私钥),使得

pG = Q

其中 G 是生成点,Q 是公钥。

在给定公钥和生成点的情况下,通过计算私钥几乎不可行,因此为 ECDSA 提供了安全性。理解这一点的一种方式是取两个质数并将它们相乘,例如:

134669 * 2467 = 332228423

给定结果,将非常困难(实际上不可能)计算出输入的质数,即使是计算机也是如此。除去这一假设的例外是量子计算。量子计算提供了一种解决此问题的方法,从而风险 ECDSA 签名的安全性,能够从公钥提取私钥。

2. ECDSA 签名 - 签名是如何创建的?

ECDSA 签名算法接受消息和私钥并产生一个签名,即一对整数 (r, s)

ECDSA 签名算法的工作步骤如下:

  1. 计算消息 哈希,使用密码哈希函数,例如 SHA-256

h = hash(msg)

  1. 安全地生成一个 随机 数字 k
  2. 计算随机点 R = k * G 并取其 x 坐标:r = R.x
  3. 使用公式计算签名证明 s

s = k^-1 * (h + p * r) mod n

其中 p 是签署者的私钥,而阶数 n

  1. 返回签名 (r, s)

3. ECDSA 签名验证 - 签名是如何被验证的?

ECDSA 签名验证算法接受已签名的消息 msg、由签名算法生成的签名和公钥 pubKey。输出为一个布尔值,表示签名是 有效 还是 无效

ECDSA 签名验证算法通过将 s 转换回 RR’)来进行验证,使用公钥和消息哈希。恢复的 R 的 x 坐标 r' 与签名中的 r 进行比较:

  1. 计算消息哈希,使用签名时所用的相同哈希函数
  2. 计算签名证明的模反元素 s1

s1 = s^-1 (mod n)

  1. 恢复在签名过程中使用的随机点:

R' = (h * s1) * G + (r * s1) * pubKey

  1. R' 中提取 r'r' = R'.x
  2. 通过比较是否 r' == r 来计算签名验证结果

ecrecover 是 EVM 预编译函数,允许检索通过其私钥使用 ECDSA 签名的消息的签署者地址。它使智能合约能够验证签名的完整性并检索签署者。

关于椭圆曲线数字签名算法的总结

本文作为 ECDSA 的综合指南,涵盖了其在身份验证、签名创建和验证中的作用。它深入探讨了密钥生成的细节和非对称加密的安全方面。理解这些概念对于掌握签名在智能合约安全中的重要性至关重要。

  • 原文链接: cyfrin.io/blog/elliptic-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cyfrin
cyfrin
Securing the blockchain and its users. Industry-leading smart contract audits, tools, and education.