《BITCOIN AND CRYPTOCURRENCY TECHNOLOGIES》Chapter 1系列
1.3. DIGITAL SIGNATURES数字签名
目录
一、数字签名性质
我们希望数字签名需要有两个性质:
1、只有你自己可以签名,别人看到签名可以验证它是否有效。
2、希望你的签名和你签名的文档进行绑定,这样这个签名不会被乱用,比如拿去签(贴)到别的文档上。
二、数字签名方案
● (sk, pk) :=generateKeys(keysize)
把keysize作为输入,来产生一对公钥pk和私钥sk。私钥sk是属于私密的,用来对消息进行签名;公钥pk是人人都可以找到的,拿到它,就可以用来验证签名。
● sig:=sign(sk, message)
即签名过程,把一段消息和私钥作为一个输入,输出签名(a signature for message under sk)。
● isValid:=verify(pk, message, sig)
验证过程,通过把公钥、一段消息、签名作为输入,如果返回的结果是真,证明签名属实;如果返回的结果为假,证明签名消息为假。
我们要求以下两个性质有效:
1、 有效签名可以通过验证,即:
verify(pk, message, sign(sk, message))==true
2、签名不可伪造。
我们注意到generateKeys和签名可以是随机算法,事实上generateKeys最好是随机的,因为它需要为不同的人产生不同的Keys。相反的,验证通常是确定的。
更详细的讨论数字签名的两个性质:
- straightforward:有效的签名必须能够验证。如果我对一段消息message用私钥sk签名,那么某个人用公钥pk和同样的一段消息message对我的签名sign进行验证时,签名一定是正确有效的。
- unforgeability:不可伪造性。an adversary who knows your public key and sees your signatures on some other messages can’t forge your signature on some message for which he has not seen your signature.
三、Unforgeability game 不可伪造游戏
FIGURE 1.9. Unforgeability game. The attacker and the challenger play the unforgeability game. If the attacker is able to successfully output a signature on a message that he has not previously seen, he wins. If he is unable to do so, the challenger wins, and the digital signature scheme is unforgeable. Photograph of Whit Diffie (right), cropped, © Kevin Bocek. Licensed under Creative Commons CC BY 2.0.
即不可伪造游戏。如果黑客可以在一个之前没有见过的消息上进行签名,那么黑客就赢得这个游戏;反之,如果黑客做不到,挑战者就赢得游戏,从而可以证明这个数字签名方案是不可伪造的。(具体游戏过程参考书的53页)
- 这个游戏的设定与真实世界相似,现实中的攻击者很可能可以从潜在受害者的很多不同文件中看到有效签名,攻击者甚至还可能操控受害者签署一份看起来无害但对黑客有利的文件。
- 将这一点建模到我们的游戏中,允许黑客自己选择一些文件进行签名,只要猜测的数量合情(允许攻击者尝试猜测一百万次,但不能是280次)。
- 一旦攻击者满意他所看到的签名数量,那他就可以挑选某条信息M,尝试在上面伪造签名。对M的唯一限制就是, 它必须为攻击者之前未在之上看过签名的信息(因为很明显,攻击者可以发出他发出到过的签名)。
- 挑战者运行验证算法,以此确定攻击者生成的关于M信息签名在经过公共验证密钥验证后,是否属实。如果验证成功,攻击者赢得游戏。
不论对手使用什么算法,当且仅当他成功伪造信息的机会非常小——小到我们可以假设在实践中从不会发生时,我们就说签名方案不可伪造。
四、Practical Concerns 实践中的考量
1、要将算法概念转化为现实中可执行的数字签名机制,还需要一些实际操作。例如,很多签名算法是随机的(特别是比特币使用的算法),因此我们需要一个好的随机性来源。。我们不能低估这一点的重要性,因为糟糕的随机性会使原本安全的算法变得不安全。
2、信息的size。实际上,要签名的message是有长度大小限制的。解决:假设hash是一个具有256位输出的哈希函数。我们就在hash(message)上进行签名,而不是在message上直接签名。这样message的长度就没有限制了。且哈希函数有抗碰撞性的性质,所以可以放心用。
3、我们后面会用到的另一个技巧是,可以对于哈希指针进行签署。如果你签署了哈希指针,那么该签名覆盖(或者说保护)整个结构——这不仅仅是哈希指针本身,还包括哈希指针指向的整个区块链。比如,如果签署了区块链末尾的哈希指针,其结果就是你有效地数字签署了整条区块链。
五、ECDSA
比特币使用一种特殊的数字签名方案,称为椭圆曲线数字签名算法(ECDSA)。ECDSA是美国政府标准,是早期DSA算法的更新,适用于使用椭圆曲线。多年来,这些算法已经接受了大量的密码分析,并且通常被认为是安全的。
参考:
《BITCOIN AND CRYPTOCURRENCY TECHNOLOGIES》
https://blog.csdn.net/xiaohuanglv/article/details/89032522