深入浅出密码学(上)

前言

无论你有没有意识到,日常生活中我们几乎每天都在跟密码学打交道。只要你接触过互联网,那么基本上离不开密码学。举个最简单的例子,现在的很多网站都是通过HTTPS协议进行通信的,而支撑着HTTPS协议正常运行的正是密码学这一理论基础。作为程序员,我们更是有必要了解下密码学的一些基本理论及其背后的原理。本文将通过通俗易懂的语言为大家介绍下密码学的概念,希望大家看完能够对密码学有初步的认识。

一、加密

在介绍加密之前,我们先引入一个场景。假设有2个人小明和小白,他们俩通过电子邮件进行沟通。由计算机网络的知识我们可以知道,小明发给小白的邮件会被拆分成多个数据报文在网络中进行传输,假如说有个窃听者小黑截获了小明发给小白的数据报文,并将截获的数据报文按顺序组装起来,然后按照标准邮件传输协议进行解析,则小黑就可以获得小明发送给小白的邮件内容了,因此在这个发邮件的过程中就存在被第三者窃听的风险。为了解决这个问题,我们需要对信息进行加密以防止数据被窃听。接下来介绍今天要讲的第一个内容:加密。

在上述例子中,之所以存在数据被窃听的风险,是因为在通信的过程中邮件内容是通过明文进行传输的。明文就是未加密处理的消息内容,在上述例子中就是邮件内容。假如说小明跟小白在邮件通信的过程中采用了只有双方看得懂的文字,那么即使这些文字被第三者截获了,那么第三者也看不懂其中的含义,这样就可以防止窃听了。而这个过程就是加密,即将明文转换成密文的过程,密文对于第三者而言就是没有任何意义的数据,只有通信双方才有办法将密文转换成明文,进而获取邮件里传输的原始可读内容。而将密文转换成明文的过程就是解密。

既然要进行加密跟解密就必须用到密钥。密钥与数据的关系可以理解成保险柜钥匙跟保险柜的关系,只有正确的保险柜钥匙才能打开对应的保险柜,同理也只有正确的密钥才能对数据进行加密或解密。而根据密钥的特点,可以将加密分为对称加密和非对称加密(也叫公钥加密)。

1)对称加密

对称加密是指在加密和解密的过程使用同一密钥的加密方式。在上述收发邮件的例子中,如果小明和小白约定好对称加密的算法(比如说DES)跟密钥,则小明在发送邮件给小白时,可以用双方约定好的算法跟密钥进行加密后发送给小白,小白收到加密后的邮件数据后,还是用之前约定好的算法跟密钥进行解密,这样一来小白就能获取到小明发送给小白的原始邮件内容了。而在通信过程中,即使窃听者窃听了通信内容,由于他不知道加密算法跟密钥,因此无法解析出原始的邮件信息,从而达到了防止窃听的目的。

2)非对称加密

非对称加密,顾名思义就是加密跟解密的过程使用不同的密钥的加密方式。用于加密的密钥称为公钥,用于解密的密钥称为私钥。公钥是公开的,即任何人都可以获取到,而私钥只有数据的接受者才有。因此任何人都可以获取公钥对数据进行加密后再发送数据给私钥的拥有者,由于只有私钥才能对数据进行解密,因此也就只要私钥的拥有者才能正确将密文解密成明文,故而也能实现防止窃听的功能。

大家可能会问,既然有了对称加密,为什么还会出现非对称加密呢?非对称加密对于对称加密而言究竟有什么优点呢?在现实世界中,使用对称加密方式,必定会遇到一个密钥配送的问题。因为在对称加密的过程中,密钥必须通信双方都知晓才能安全通信,假如密钥泄露了,那么整个通信过程还是存在被窃听的风险。因此对称加密能正常运作的前提是密钥能够做到可靠配送,而密钥配的可靠配送有时候并不简单。

而如果使用非对称加密就不存在密钥配送的问题,因为用于加密的公钥是公开的,不具有私密性,任何人都可以获取到,因此只要数据的接受者保管好私钥就能正常使用非对称加密进行通信了。这就是非对称加密相对于对称加密的优点。

二、单向散列函数

在介绍单向散列函数之前,我们还是先引入一个场景。相信我们大家都在网上下载过软件或者文档,那么大家有没有想过一个问题就是当你把网络上的文档下载到你自己的电脑上时,你怎么确定你下载的文件没有被别人修改过呢?根据计算机网络的知识我们可以知道,你从远程主机下载的文件是分成多个数据报文传输到你自己的电脑上的,这个时候第三者是可以截获到这些数据报文的,假如这个第三者他不止截获了数据报文,他还修改了其中的一些内容,然后再转发给你,这个时候你怎么识别出你下载的文件是否被篡改呢?这就要借助单向散列函数了。

单向散列函数是一个输入跟输出的映射,输入是指数据(也叫做消息),输出就是散列值。大家可以理解成就是一个函数:y=f(x),其中x是原始数据,y是散列值。只是这个函数有2个比较特殊的地方就是:1、数据不同,输出的散列值也不同,也就是不同的x,算出来的y是不同的;2、函数是单向的,就是由数据可以算出散列值,但是由散列值无法算出原始数据。单向散列函数中的数据跟散列值的关系大家可以理解成一个人跟他的指纹的关系,一个人跟他的指纹是一一对应的,不同人的指纹是不一样的,具有唯一性;同时根据一个人可以得到他的指纹信息,但是根据指纹信息没法获得一个人的所有信息,因此是单向性的。

根据单向散列函数的上述2个主要特点,就能用来确认数据的完整性了。因为即使数据只被修改了1比特,其算出来的散列值差异也会非常大,根据这一点就能确保数据的完整性了。此外,由于单向散列函数的单向性,使得他不能用于加密,因为只能从数据算出散列值,而无法从散列值算出原始数据。

在上述的检测下载文件完整性的例子中,只要在下载了文件之后,再从源网站查询该文件的散列值,然后对下载到本机的文件计算散列值,并与源网站的散列值进行对比,就能确认数据的完整性了。

单向散列函数虽然可以识别篡改,但是无法识别伪装,也就是无法确认这份文件确实是从官方网站下载下来的。要识别伪装,就需要借助其他技术手段,由于篇幅所限,后续会再进行探讨。

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

猜你喜欢

转载自blog.csdn.net/hzjjames/article/details/81143972