1.3 数字签名(digital signatures)
数字签名被认为是对纸上手写签名的数字模拟。我们对数字签名有两个特性要求:
1. 只有你可以制作你自己的签名,但任何看到它的人都可以验证其有效性;
2. 签名只与某一特定文件发生联系,该签名不能用于表明你同意或支持另一份不同的文件。
数字签名方案
数字签名方案由以下三个算法构成:
● (sk, pk) := generateKeys(keysize)
公钥和私钥生成 generateKeys方法把keysize作为输入,来产生一对公钥pk和私钥sk;
私钥sk被安全保存,用来签名一段消息;
公钥pk则是人人可以找到,用来验证你的签名
● sig :=sign(sk, message)
sign签名过程 是把一段消息message和私钥sk作为一个输入,对于消息的输出就是签名
● isValid :=verify(pk, message, sig)
verify验证过程 是通过把一段消息、签名消息和公钥作为输入,如果返回的结果是真,证明签名属实;如果返回的结果为假,证明签名消息为假。
注意,generateKeys和sign都可以采用随机算法,而verify则需要是确定的。
数字签名需要满足以下两个性质:
● 有效签名可以通过验证,即:
verify(pk, message, sign(sk, message))==true
● 签名不可伪造。
实践中的考量
◊ 很多签名算法是随机的(特别是比特币使用的算法),因此我们需要随机性的良好来源。
◊ 信息大小。实际上能够签署的信息大小是有限的,因为实在有限长度的字符串中运行。
有一个简单的方法可以解决这个限制:对信息的哈希值进行签署,而非对信息本身进行签署。
◊ 可以对于哈希指针进行签署。如果你签署了哈希指针,那么该签名覆盖(或者说保护)整个结构——这不仅仅是哈希指针本身,还包括哈希指针指向的整个区块链。
椭圆曲线数字签名算法
比特币使用的数字签名方案叫作椭圆曲线数字签名算法(ECDSA)。
算法中一些有用的参数:
个人密钥:256位
公钥(未压缩):512位
公钥(压缩):257位
待签名信息:256位
签名:512位
注意,严格来讲,虽然ECDSA只能签署256位的信息,因为信息在签署之前总是已经经过哈希压缩,因此,任何大小的信息都能被有效签署。