『学概念找员外』数字签名

员外在第一次听到数字签名这个概念的时候,有一种感觉,就是这明明是一种计算机领域的加密算法,为什么非要叫他数字签名呢?如果您也有这种疑问,今天这篇文章一定要看下去。

数字签名一词从何而来

且听员外给您瞎掰扯一段。早在计算机出世之前,人们在签署一些重要文件的时候,都是本人签字,同时在再一些防伪标记。这样做有两个好处:第一你可以制作只属于你的签名,同时其他人可以根据你的签名来验证其真假;第二,你在这份文件上面签好的字,只在这份文件上生效,跟其他文件没有任何关系,别人即使把你的签名剪下来贴在其他文件上,也是无效的。

后来在计算机的普及下,越来越多的人们在计算机的世界里也会有像签字这样的需求,同样,不仅要能有效签名,还必须要满足上面文字签名的两个特性,所以在这样的背景下,数字签名诞生了。

数字签名方案

数字签名方案由以下三个算法构成

  • (sk, pk) :=generateKeys(keysize)
    • generateKeys就是一个用来专门生成私钥和公钥的一种计算函数,如果您想要生成属于自己的私钥和公钥的话,那么您只需要在这个函数中输入一个 keysize,也就是密钥大小,然后即可得到您想要的私钥和公钥。其中私钥 sk 需要您来安全保存,公钥 pk 是公布给大众的。如果您用自己的私钥对某段信息进行加密了,那么公众拿到您的公钥就可以对加密后的信息进行验证,看其是不是属于你的签名。
  • sig:=sign(sk, message)
    • sign()是用来签名的计算函数。只要您把自己的私钥 sk 和 想要加密的信息输入,输出的信息 sig 就是加密后的签名。
  • isValid:=verify(pk, message, sig)
    • verify()是一个验证函数,验证者需要同时拥有公钥、加密前的信息以及加密后的信息,然后输入到verify()这个函数里面,最后会输出一个结果,该结果要么是真(true),证明签名属实,反之是假(false),证明签名是假的。

我们要求以下两个性质有效:

  • 有效签名一定可以通过验证,即:verify(pk, message, sign(sk, message))==true;
  • 签名不可伪造。

不可伪造性

也就是说,如果有一个人持有你的公钥,同时还有你对某一个信息签名后的结果和这份信息原始的样子,他也只能是知道这些信息而已。无法根据拥有的信息在其他文件上伪造你的签名,前提是这个其他文件你是从来没有签过名而且你的私钥也没有泄漏的情况下。这一不可伪造特性类似于我们与对手之间在进行一场游戏,游戏的使用在密码安全证明中很常见。

真的没有伪造的可能吗?

其实并不是绝对意义上的不可伪造,说到底这其实也是一个数量级的问题,就像之前我们说过的哈希碰撞的概率一样,如果攻击者的尝试次数超过了密钥位数的 n 个次方,那就真的会破解成功获取到你的签名。只不过这样的机会非常非常小,小到我们可以假设在实践中不会发生。

你可能感兴趣的:(『学概念找员外』数字签名)