密码学系列 – 椭圆曲线签名的基本原理

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•Ps=hash(m,R)*x+r, 所以现在有:

hash(m, R)•X+R = s•P

好的,这里的说法是:如果您可以提供满足上述等式的 mRs,那么这证明您知道等式中 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系列
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>