在上一节,我们用私章和公章类比了数字签名的基本思想。现在,让我们看看现实中的两种主流签名算法——RSA签名和ECDSA,它们分别是如何实现这个思想的。
RSA签名:从加密到签名的巧妙反转
RSA签名其实是RSA加密算法的逆用。回忆一下RSA加密:用公钥加密,用私钥解密。签名正好反过来:用私钥签名,用公钥验证。
RSA签名的生成过程
假设爱丽丝要给鲍勃发送一条消息,并用自己的私钥签名:
- 计算哈希:爱丽丝先对原始消息计算一个哈希值(比如用SHA-256)。这有两个好处:一是压缩数据长度,二是让签名和消息内容紧密绑定。
- 私钥加密:爱丽丝用自己的RSA私钥对哈希值进行“加密”。这里的“加密”就是RSA的模幂运算:( s = h^d \mod n ),其中 ( h ) 是哈希值(转为数字),( (n, d) ) 是私钥。得到的 ( s ) 就是签名。
- 发送:爱丽丝把原始消息和签名 ( s ) 一起发给鲍勃。
RSA签名的验证过程
鲍勃收到消息和签名后:
- 公钥解密:鲍勃用爱丽丝的公钥 ( (n, e) ) 对签名进行“解密”:( h’ = s^e \mod n ),得到 ( h’ )。
- 重新计算哈希:鲍勃对收到的消息用同样的哈希函数计算哈希值 ( h )。
- 比对:如果 ( 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 ) 为例):
- 计算哈希 ( h = \text{Hash}(m) )。
- 生成一个临时随机数 ( k )(必须每次不同且保密)。
- 计算点 ( (x, y) = kG )。
- 计算 ( r = x \mod n ),如果 ( r = 0 ) 则重选 ( k )。
- 计算 ( s = k^{-1} (h + d \cdot r) \mod n ),如果 ( s = 0 ) 则重选 ( k )。
- 签名就是 ( (r, s) )。
验证:
- 验证 ( r ) 和 ( s ) 在 ( [1, n-1] ) 内。
- 计算 ( w = s^{-1} \mod n )。
- 计算 ( u_1 = h \cdot w \mod n ),( u_2 = r \cdot w \mod n )。
- 计算点 ( (x, y) = u_1 G + u_2 Q )。
- 如果 ( 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曲线)有几个原因:
- 密钥短:256位的私钥和公钥,便于存储和传输。比特币地址就是从公钥哈希得到的。
- 安全性足够:256位ECC的安全强度高于2048位RSA,至今未被攻破。
- 效率高:签名生成和验证快,对于需要大量交易的区块链至关重要。
- 确定性:secp256k1曲线参数选择透明,没有隐藏后门的疑虑。
当然,ECDSA也有需要注意的地方:它需要一个高质量的随机数生成器,如果随机数 ( k ) 泄露或被重复使用,私钥就可能被算出(这在过去曾导致一些比特币钱包被盗)。
小结
RSA签名和ECDSA都是成熟可靠的数字签名方案,它们各自有优缺点和应用场景。RSA胜在简单、普适;ECDSA胜在高效、紧凑。在实际系统中,两者常常并存——比如TLS握手时,服务器证书可能用RSA签名,而密钥交换可能用ECDHE,签名验证则可能涉及两种算法。
下一节,我们将讨论一个关键问题:你怎么知道某个公钥真的属于某个网站?这就是数字证书和PKI要解决的问题。