前言
在之前的文章《深入浅出密码学(上)》与《深入浅出密码学(中)》,笔者为大家介绍了密码学中的加密、单向散列函数与消息认证码的概念与应用。这里带大家简单回顾一下,在网络通信中,消息存在被窃听的风险,因此我们需要对消息进行加密来防止消息被窃听。而如果我们需要保证消息的完整性或一致性,则可以使用单向散列函数。而单向散列函数的局限性是无法对通信双方进行认证,即无法证明某条消息是某个人发出的,因此我们还需要消息认证码来解决消息认证的问题。然而消息认证码仍然不是十全十美的,其无法解决“否认”的问题,即仅仅使用消息认证码存在“抵赖”的风险。那么有什么方法来弥补消息认证码的缺点呢?下文将为大家揭晓答案。
数字签名
在《深入浅出密码学(中)》一文中,我们知道消息认证码之所以无法防止否认,其原因是在消息认证码的使用过程中需要使用到共享密钥。因此如果要防止否认,那么可以考虑不使用共享密钥的其他方式对消息进行认证,而数字签名就是这样一种消息认证方式。
数字签名的使用过程中主要涉及以下两种行为:
生成消息签名
验证消息签名
生成消息签名由消息发送者完成,验证消息签名一般由消息接接收者完成,如果消息签名验证通过则可证明消息是由可信的发送方发送的。数字签名之所以可以防止否认,是因为生成消息签名跟验证消息签名是使用不同的密钥来完成的。消息发送者使用“签名密钥”对消息进行签名,消息接收者使用“验证密钥”对消息进行验证,且签名阶段只能使用“签名密钥”无法使用“验证密钥”进行签名。此外“签名密钥”只能由消息发送者持有,不可泄露,而“验证密钥”则是公开的,任何需要对消息进行认证的人都能获取到。
大家有没有觉得数字签名与之前谈到的非对称加密有点类似呢?实际上,数字签名可以看成是把非对称加密“反过来用”。非对称密钥是消息发送者使用公钥进行加密,消息接收者使用私钥进行解密。而数字签名是消息发送者使用私钥生成签名,而消息接收者使用公钥对签名进行验证。两者的区别见下表:
私钥 | 公钥 | |
---|---|---|
非对称加密 |
接收者解密时使用 |
发送者加密时使用 |
数字签名 |
发送者生成签名时使用 |
接收者验证签名时使用 |
数字签名的使用方式
加下来介绍下数字签名的使用方式,一般有如下两种使用方式:
直接对消息进行签名
对消息的散列值进行签名
由于在通信的过程中,消息的体积可能非常大,如果直接对消息进行签名的话会非常耗时,所以在实际中用的比较多的还是对消息的散列值进行签名,在这里我们也只详细介绍对消息的散列值进行签名这种方式。以下是对消息的散列值进行签名和验证的过程:
因为数字签名中生成签名跟验证签名使用的是不同的密钥,因此数字签名可以防止否认,同时也能识别篡改,因为即使消息被修改了1比特,其计算出来的签名也会相差很大。再者,由于数字签名不需要共享密钥,因此也不存在密钥的配送问题。然而要使用数字签名还有一个前提条件就是,必须验证公钥的持有者确实是属于消息的发送者。即使数字签名再强大,如果你得到的公钥是伪造的,那么数字签名也会完成失效。而为了确保公钥确实是由消息的发送者发布的,则可以使用证书。有兴趣的朋友自己查资料进行深入了解。
关于密码学的基础知识就介绍到这里了。
如果觉得这篇文章对你有帮助,可以扫描下方二维码,关注本人公众号,获得更多优质文章推送。