ECDSA 涉及到三个重要的概念
第一个是私钥,私钥是一个只有我自己知道的数字,我可以用私钥去生成签名,比特币使用的私钥是一个256 bit 的整数。
第二个是公钥,公钥是跟私钥配对的一个数,是根据私钥运算得出的,我会把公钥公布给所有人,目的是让大家去验证我的签名。比特币的公钥有65个字节,包括一个前缀加上两个256 bit 的整数,这两个整数就对应椭圆曲线上的一个点的 x 值和 y 值。
第三个是签名,签名就是一个证明我的确执行了签署操作的数字。签名主要由两项内容运算得出,一项是被签署数据的哈希,另外一项就是私钥。签名要保证两点:一个是证明我是私钥的持有者,第二个是证明被签名数据没有被篡改过。
如何证明你知道私钥 x
如果您计算 X=x•P
,其中 x 是一个随机的 256 位整数,您如何向某人证明您知道与 X 对应的 x,而不泄露有关 x 的任何有用信息?
您可以使用之前的点加法属性:
n•P+r•P = (n+r)•P
稍微修改一下:
hash(m, r•P)•n•P+r•P = (hash(m, r•P)*n+r)•P
如果你展开上面方程的右边,你会得到左边,所以上面的方程对任何 m、r 和 n 都成立。
故另n=x
, 则n•P=X
hash(m, r•P)•X+r•P = (hash(m, r•P)*x+r)•P
再另 R=r•P
和 s=hash(m,R)*x+r
, 所以现在有:
hash(m, R)•X+R = s•P
好的,这里的说法是:如果您可以提供满足上述等式的 m
、R
和 s
,那么这证明您知道等式中 X 对应的 x,其中 x•P=X。
因此,为 m、R 和 s 提供工作值的唯一方法是使用 x 计算它们。因此,您可以通过提供满足 hash(m,R)•X+R=s•P 的 m、R 和 s 的值来证明您知道与公钥 X 对应的私钥 x。
数字签名的构成
由前面的推导,可以看出只要我展示出了 m、R 和 s 的值,就可以证明我是拥有私钥的。实际中我们可以把 m 作为要被签名的信息,而把 R 和 s 作为数字签名。 对于比特币来说,信息 m 就是交易,每一个数字签名之中都会包含 R 的 x 坐标值( R 是椭圆曲线上的一个点),还会包含 s (s 是一个256 bit 的整数)。
如果在验证数字签名的时候信息被篡改过了,也就是说此刻 m 有了一个被篡改后的值,那么这个等式就不可能成立了,因为 s 是基于 m 的原始值运算出来的。
签名验证算法-verify
已知 P(椭圆曲线基点), m, R, s, X, 验证 hash(m, R)•X+R = s•P
等式是否成立
公钥恢复算法-recover
已知 P(椭圆曲线基点), m, R, s, 通过 hash(m, R)•X+R = s•P
方程式求出 X, 与正确的公钥进行比较
-
往期精彩回顾:
- 区块链知识系列
- 密码学系列
- 零知识证明系列
- 共识系列
- 公链调研系列
- 比特币系列
- 以太坊系列
- EOS系列
- Filecoin系列
- 联盟链系列
- Fabric系列
- 智能合约系列
- Token系列