《BITCOIN AND CRYPTOCURRENCY TECHNOLOGIES》Chapter 1系列
目录
我们希望数字签名需要有两个性质:
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。相反的,验证通常是确定的。
更详细的讨论数字签名的两个性质:

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页)
不论对手使用什么算法,当且仅当他成功伪造信息的机会非常小——小到我们可以假设在实践中从不会发生时,我们就说签名方案不可伪造。
1、要将算法概念转化为现实中可执行的数字签名机制,还需要一些实际操作。例如,很多签名算法是随机的(特别是比特币使用的算法),因此我们需要一个好的随机性来源。。我们不能低估这一点的重要性,因为糟糕的随机性会使原本安全的算法变得不安全。
2、信息的size。实际上,要签名的message是有长度大小限制的。解决:假设hash是一个具有256位输出的哈希函数。我们就在hash(message)上进行签名,而不是在message上直接签名。这样message的长度就没有限制了。且哈希函数有抗碰撞性的性质,所以可以放心用。
3、我们后面会用到的另一个技巧是,可以对于哈希指针进行签署。如果你签署了哈希指针,那么该签名覆盖(或者说保护)整个结构——这不仅仅是哈希指针本身,还包括哈希指针指向的整个区块链。比如,如果签署了区块链末尾的哈希指针,其结果就是你有效地数字签署了整条区块链。
比特币使用一种特殊的数字签名方案,称为椭圆曲线数字签名算法(ECDSA)。ECDSA是美国政府标准,是早期DSA算法的更新,适用于使用椭圆曲线。多年来,这些算法已经接受了大量的密码分析,并且通常被认为是安全的。
参考:
《BITCOIN AND CRYPTOCURRENCY TECHNOLOGIES》
https://blog.csdn.net/xiaohuanglv/article/details/89032522