首页/我的作品/密码学/8.2 RSA签名与ECDSA:原理与对比
密码学:守护数字世界的秘密

8.2 RSA签名与ECDSA:原理与对比

第 45 / 78 篇 · Crazy Boy

在上一节,我们用私章和公章类比了数字签名的基本思想。现在,让我们看看现实中的两种主流签名算法——RSA签名和ECDSA,它们分别是如何实现这个思想的。

RSA签名:从加密到签名的巧妙反转

RSA签名其实是RSA加密算法的逆用。回忆一下RSA加密:用公钥加密,用私钥解密。签名正好反过来:用私钥签名,用公钥验证。

RSA签名的生成过程

假设爱丽丝要给鲍勃发送一条消息,并用自己的私钥签名:

  1. 计算哈希:爱丽丝先对原始消息计算一个哈希值(比如用SHA-256)。这有两个好处:一是压缩数据长度,二是让签名和消息内容紧密绑定。
  2. 私钥加密:爱丽丝用自己的RSA私钥对哈希值进行“加密”。这里的“加密”就是RSA的模幂运算:( s = h^d \mod n ),其中 ( h ) 是哈希值(转为数字),( (n, d) ) 是私钥。得到的 ( s ) 就是签名。
  3. 发送:爱丽丝把原始消息和签名 ( s ) 一起发给鲍勃。

RSA签名的验证过程

鲍勃收到消息和签名后:

  1. 公钥解密:鲍勃用爱丽丝的公钥 ( (n, e) ) 对签名进行“解密”:( h’ = s^e \mod n ),得到 ( h’ )。
  2. 重新计算哈希:鲍勃对收到的消息用同样的哈希函数计算哈希值 ( h )。
  3. 比对:如果 ( h’ = h ),则签名有效,说明消息确实来自爱丽丝且未被篡改。否则无效。

为什么这样有效?因为只有爱丽丝的私钥 ( d ) 才能产生这样的签名,而任何人都可以用她的公钥验证。任何对消息的修改都会导致哈希值变化,从而破坏等式。

RSA签名的安全性基础

RSA签名的安全依赖于大整数分解的困难性。如果攻击者能分解 ( n ) 得到 ( p ) 和 ( q ),就能计算出私钥 ( d ),从而伪造签名。因此,RSA签名的密钥长度必须足够大(目前至少2048位)。

RSA签名的一个优点是实现简单,与加密算法统一。缺点是密钥较长,计算速度相对较慢(特别是签名生成,因为要用大指数)。

ECDSA:椭圆曲线上的签名算法

ECDSA(Elliptic Curve Digital Signature Algorithm)是基于椭圆曲线的数字签名算法。它是DSA(数字签名算法)的椭圆曲线版本,被广泛应用于比特币、TLS等场景。

ECDSA的工作原理(简化版)

ECDSA的数学细节比RSA复杂,但我们可以用直观的方式理解它的流程。它也需要一个哈希函数,签名结果由两个整数 ( (r, s) ) 组成。

参数准备:

  • 选择一条椭圆曲线,比如比特币用的secp256k1。
  • 曲线上的一个基点 ( G ),其阶为一个大素数 ( n )。
  • 签名者的私钥是一个随机整数 ( d )(1到 ( n-1 ) 之间),公钥是 ( Q = dG )(椭圆曲线上的点)。

签名生成(以消息 ( m ) 为例):

  1. 计算哈希 ( h = \text{Hash}(m) )。
  2. 生成一个临时随机数 ( k )(必须每次不同且保密)。
  3. 计算点 ( (x, y) = kG )。
  4. 计算 ( r = x \mod n ),如果 ( r = 0 ) 则重选 ( k )。
  5. 计算 ( s = k^{-1} (h + d \cdot r) \mod n ),如果 ( s = 0 ) 则重选 ( k )。
  6. 签名就是 ( (r, s) )。

验证:

  1. 验证 ( r ) 和 ( s ) 在 ( [1, n-1] ) 内。
  2. 计算 ( w = s^{-1} \mod n )。
  3. 计算 ( u_1 = h \cdot w \mod n ),( u_2 = r \cdot w \mod n )。
  4. 计算点 ( (x, y) = u_1 G + u_2 Q )。
  5. 如果 ( x \mod n = r ),签名有效;否则无效。

这个过程背后的数学保证了只有知道私钥 ( d ) 的人才能生成有效的 ( (r, s) ),而任何人都可以用公钥 ( Q ) 验证。

ECDSA的安全性基础

ECDSA的安全依赖于椭圆曲线离散对数问题(ECDLP):给定基点 ( G ) 和公钥 ( Q = dG ),很难求出 ( d )。目前,256位的椭圆曲线(如secp256k1)提供的安全性与3072位的RSA相当。

ECDSA的显著优点是密钥短、计算快、带宽占用小。这使得它非常适合资源受限的环境(如智能卡、移动设备)和需要大量签名验证的场景(如区块链)。

RSA签名 vs ECDSA:对比表

维度 RSA签名 ECDSA
数学基础 大整数分解 椭圆曲线离散对数
密钥长度 长(2048位以上) 短(256位即可达到同等安全)
签名长度 与密钥长度相当(如2048位签名) 短(通常64字节/512位)
签名生成速度 较慢(大指数运算) 较快(点乘运算)
签名验证速度 较快(公钥指数小) 较快,但略慢于RSA验证
安全性现状 2048位仍安全,但需关注量子威胁 256位安全,同样面临量子威胁
常见应用 传统TLS证书、电子邮件加密 比特币、区块链、现代TLS(如ECDHE)
实现复杂度 相对简单,算法统一 较复杂,需处理曲线参数和随机数

为什么比特币选择了ECDSA?

比特币选择ECDSA(特别是secp256k1曲线)有几个原因:

  1. 密钥短:256位的私钥和公钥,便于存储和传输。比特币地址就是从公钥哈希得到的。
  2. 安全性足够:256位ECC的安全强度高于2048位RSA,至今未被攻破。
  3. 效率高:签名生成和验证快,对于需要大量交易的区块链至关重要。
  4. 确定性:secp256k1曲线参数选择透明,没有隐藏后门的疑虑。

当然,ECDSA也有需要注意的地方:它需要一个高质量的随机数生成器,如果随机数 ( k ) 泄露或被重复使用,私钥就可能被算出(这在过去曾导致一些比特币钱包被盗)。

小结

RSA签名和ECDSA都是成熟可靠的数字签名方案,它们各自有优缺点和应用场景。RSA胜在简单、普适;ECDSA胜在高效、紧凑。在实际系统中,两者常常并存——比如TLS握手时,服务器证书可能用RSA签名,而密钥交换可能用ECDHE,签名验证则可能涉及两种算法。

下一节,我们将讨论一个关键问题:你怎么知道某个公钥真的属于某个网站?这就是数字证书和PKI要解决的问题。