深入浅出密码学(下)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 前言在之前的文章《深入浅出密码学(上)》与《深入浅出密码学(中)》,笔者为大家介绍了密码学中的加密、单向散列函数与消息认证码的概念与应用。

前言

在之前的文章《深入浅出密码学(上)》与《深入浅出密码学(中)》,笔者为大家介绍了密码学中的加密、单向散列函数与消息认证码的概念与应用。这里带大家简单回顾一下,在网络通信中,消息存在被窃听的风险,因此我们需要对消息进行加密来防止消息被窃听。而如果我们需要保证消息的完整性或一致性,则可以使用单向散列函数。而单向散列函数的局限性是无法对通信双方进行认证,即无法证明某条消息是某个人发出的,因此我们还需要消息认证码来解决消息认证的问题。然而消息认证码仍然不是十全十美的,其无法解决“否认”的问题,即仅仅使用消息认证码存在“抵赖”的风险。那么有什么方法来弥补消息认证码的缺点呢?下文将为大家揭晓答案。

数字签名

在《深入浅出密码学(中)》一文中,我们知道消息认证码之所以无法防止否认,其原因是在消息认证码的使用过程中需要使用到共享密钥。因此如果要防止否认,那么可以考虑不使用共享密钥的其他方式对消息进行认证,而数字签名就是这样一种消息认证方式。

数字签名的使用过程中主要涉及以下两种行为:

  1. 生成消息签名

  2. 验证消息签名

生成消息签名由消息发送者完成,验证消息签名一般由消息接接收者完成,如果消息签名验证通过则可证明消息是由可信的发送方发送的。数字签名之所以可以防止否认,是因为生成消息签名跟验证消息签名是使用不同的密钥来完成的。消息发送者使用“签名密钥”对消息进行签名,消息接收者使用“验证密钥”对消息进行验证,且签名阶段只能使用“签名密钥”无法使用“验证密钥”进行签名。此外“签名密钥”只能由消息发送者持有,不可泄露,而“验证密钥”则是公开的,任何需要对消息进行认证的人都能获取到。

大家有没有觉得数字签名与之前谈到的非对称加密有点类似呢?实际上,数字签名可以看成是把非对称加密“反过来用”。非对称密钥是消息发送者使用公钥进行加密,消息接收者使用私钥进行解密。而数字签名是消息发送者使用私钥生成签名,而消息接收者使用公钥对签名进行验证。两者的区别见下表:

  私钥 公钥

非对称加密

接收者解密时使用

发送者加密时使用

数字签名

发送者生成签名时使用

接收者验证签名时使用

数字签名的使用方式

加下来介绍下数字签名的使用方式,一般有如下两种使用方式:

  1. 直接对消息进行签名

  2. 对消息的散列值进行签名

由于在通信的过程中,消息的体积可能非常大,如果直接对消息进行签名的话会非常耗时,所以在实际中用的比较多的还是对消息的散列值进行签名,在这里我们也只详细介绍对消息的散列值进行签名这种方式。以下是对消息的散列值进行签名和验证的过程:

因为数字签名中生成签名跟验证签名使用的是不同的密钥,因此数字签名可以防止否认,同时也能识别篡改,因为即使消息被修改了1比特,其计算出来的签名也会相差很大。再者,由于数字签名不需要共享密钥,因此也不存在密钥的配送问题。然而要使用数字签名还有一个前提条件就是,必须验证公钥的持有者确实是属于消息的发送者。即使数字签名再强大,如果你得到的公钥是伪造的,那么数字签名也会完成失效。而为了确保公钥确实是由消息的发送者发布的,则可以使用证书。有兴趣的朋友自己查资料进行深入了解。

关于密码学的基础知识就介绍到这里了。

如果觉得这篇文章对你有帮助,可以扫描下方二维码,关注本人公众号,获得更多优质文章推送。

相关文章
|
6月前
|
算法 安全 PHP
密码学系列之二:密码学基本概念
密码学系列之二:密码学基本概念
密码学系列之二:密码学基本概念
|
6月前
|
机器学习/深度学习 算法 JavaScript
密码学系列之四:一文搞懂序列密码
密码学系列之四:一文搞懂序列密码
|
Web App开发 Rust 算法
【密码学】一文读懂ChaCha20
好久没写新的加密算法的原理了, 这次所选取的加密算法结构比较简单, 一起来看一下吧。
7594 0
【密码学】一文读懂ChaCha20
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
2192 0
【密码学】一文读懂MurMurHash2
|
Rust 算法 Go
【密码学】一文读懂MurMurHash3
本文应该是MurMurHash算法介绍的最后一篇,来一起看一下最新的MurMurHash算法的具体过程,对于最新的算法来说,整个流程和之前的其实也比较相似,这里从维基百科当中找到了伪代码,也就不贴出来Google官方给出的推荐代码了,先来看一下维基百科给出的伪代码,这里只有32位的伪代码。
2148 0
【密码学】一文读懂MurMurHash3
|
Rust 算法 网络安全
【密码学】一文读懂CMAC
介于上一篇文章比较水,然后这个和上一篇也比较相似,CMAC是为了解决DAA当中安全性不足的问题而出现的,这个算法一共有三个密钥,K, K1, K2, 其中K1和K2可以由K导出,接下来就来一起看一下CMAC的具体过程吧,这一篇文章其实也不长。
3707 0
【密码学】一文读懂CMAC
|
算法 数据安全/隐私保护
【密码学】一文读懂Whirlpool
首先呢,祝大家今晚节日快乐,Whirlpool是由Vincent Rijmen(高级加密标准的联合创始人)和Paulo S.L.M.Barreto设计的,后者于2000年首次提出了它。
1105 0
【密码学】一文读懂Whirlpool
|
2月前
|
存储 安全 算法
解密现代密码学:从基础到实战
在数字时代,保护信息安全变得至关重要。本文将带你深入探索密码学的奥秘,从基础的加密算法到现代的加密技术,揭示如何在日常开发中实现数据的安全传输和存储。我们将一起学习加密的基本原理,探讨常见的加密技术,并提供实用的代码示例,帮助你在项目中实施强大的安全措施。
|
算法 安全 Go
【密码学】一文读懂HKDF
我这又来水一篇文章,来聊一下HKDF(基于HMAC的密钥导出函数)。密钥派生函数是密钥管理的组成部分,他的目标是通过一些初始的数据派生出来密码学安全的随机密钥。
3076 1
【密码学】一文读懂HKDF
|
6月前
|
机器学习/深度学习 算法 安全
密码学的100个基本概念
密码学的100个基本概念