密码学基础知识

929 阅读9分钟

序言:

在web应用中,我们往往需要保证数据传输的安全性。设想一下,如果我们在页面中填写表单信息并提交到服务器的过程中,表单的信息被其他恶意用户所截取到,那是不是非常不安全?也正因为此,我们从刚开始的HTTP协议转变到了现在的HTTPs协议。本文将从密码学起源开始,逐渐介绍密码学的发展过程,以及HTTPs的连接过程。

一. 密码学的发展

密码学一词最早来自希腊语中的短语“secret writing”,至今为止已经有辉煌了几千年历史了。

谁会用到密码学?密码学是被谁发展的呢?

历史上,有四类人用到了密码学,并为之做出了重要的贡献。分别是:军事人员,外交人员,写日记者,情侣。 而军事记者在其中扮演了最重要的角色,并一直不断的完善着这个领域。

几个基本概念

明文就是我们待发送的消息,经过一个秘钥为参数的函数变换,变换的结果就是加密后的密文

image.png
破解密码的技术就叫作密码分析学,而密码分析学和密码编码一起组成了密码学。

而明文是通过秘钥进行函数转换得到的秘钥,所以不难看出,密码学的发展和数学密切相关。

在历史上,加密方法被分为两大类:置换密码和替代密码。

置换密码

在置换密码中,每个字母或者每一组字母被另一个字母或另一组字母取代,从而将原来的字母掩盖起来。

比如说我们将a替换为1,b替换为2,c替换为3.........

那么acbdadcca就可以被翻译成132414331

替代密码

替代密码保留了明文符号的顺序,但是将明文伪装起来了。与此相反,替代密码重新对字母进行排序,但是并不伪装明文。

现在我们要传输的数据是:kanwowenzhangdianzandedoushidashuaibi

下面是一个列换位方式的替代密码。

  1. 选取一个不包含重复字母的单词或者短语作为秘钥。这里选取MEGABUCK
  2. 依据秘钥给不同字母进行1 2 3的排序列。
  3. 对明文进行以行的单位的排序。
  4. 按照顺序,以列为单位读取出这个数据。

image.png

这样我们经过秘钥翻译后的密文就是:wnhiogibeeaahuunasandskzoh

但是计算机的运行速度非常快,对它来说这不是小菜一碟? 所以这些编码方式都是非常容易被破解的,这里不详细介绍。

对称秘钥算法和非对称秘钥算法

现代密码学使用的还是与传统密码学相同的思想(替代和置换),但是重点有所不同。传统上密码设计者使用了非常简单的算法。现在情形完全相反,密码设计的目标是使得加密算法尽可能的错综复杂,因而即使密码分析者获得了大量的选择密文,在没有秘钥的情况下也不可能推测出我们的明文。

对称秘钥算法

第一种算法就是对称秘钥算法:使用相同的秘钥来加密和解密算法

1977年1月,美国政府采纳了IBM开发的第一个乘积密码作为非机密信息的官方标准,这个标准就是数据加密标准DES(DATA Encryption Standard)。 此时数据的秘钥长度是56位。

1979年初,IBM公司遗失到DES的秘钥长度太短,于是利用三重加密来有效增加DES的长度。

随着DES逐渐走到了生命的尽头,高级加密标准AES(Adcanced Encryption Standard)出现了。而其中最好用的就是Rijindael算法,它含有128位秘钥。128位的秘钥空间中含有3x10的38次方个秘钥,计算机是不可能在几十年内计算出来的。

非对称密钥算法RSA

在历史上,分发秘钥往往是绝大多数密码系统最为薄弱的环节,不断一个密码系统有多么的强,但是如果入侵者能够偷到秘钥,那么整个系统将变得毫无价值。

1976年斯坦福大学两名研究人员提出了非对称加密算法。秘钥一共有两个,称为公钥和私钥;加密和解密所用的秘钥不相同。并且使用公钥加密的数据用私钥才能够解开,用私钥加密的数据使用公钥才能够解开。

这种方式是如何工作的呢?首先我们创建出一对秘钥,将公钥公开出来,别人向我发送数据可以使用我的公钥进行加密,因为私钥只有我自己才知道,所以别人是无法解密这个消息的。

研究人员们都觉得这种方式非常好,所以都在使劲研究这种算法。1978年Rivest,Shamir,Adleman三个人创建出了RSA算法,由于这个算法的安全性非常高,所以三人也共同被授予2002年的ACM图灵奖。

RSA的本质是基于数学难题“分解大数的难度” 以及“以大素数为模来计算离散对数的难度”基础上的算法。(所以密码学与数学息息相关,数学不好的人不容易学),这两个问题数学家们已经为之钻研了许多年而未能有所突破。

常见的概念

数字签名

和现实生活中我们的签名一样,根据数字签名能够证明我们本人在互联网中的唯一性。

数字签名需要满足一下几个条件:

  1. 接收方可以验证发送方所声称的身份。
  2. 发送方以后不能否认该消息的内容。
  3. 接收方不能够自己编造这样的信息。

具体实现步骤:
发送方发送数据的时候,使用散列算法对发送数据进行运算得到一串消息摘要,然后用自己的私钥对消息摘要进行加密。将加密后的结果和消息原文一起发送给接收方。接收方使用相同的散列算法对消息原文进行运算,再使用发送方的公钥对加密后的数据进行解密,比较二者消息摘要是否相同,从而保证数据的完整性。

image.png

消息摘要

消息摘要算法中最著名的就是安全散列算法SHA-1(Secure Hash Algorithm 1)算法。

发送方将明文消息进行SHA-1算法运算,可以获得一个消息摘要,然后发送方再用自己的秘钥对这个消息摘要进行签名。和明文数据一起发送给接收方。接收方接收到以后需要做两件事情。1. 对明文数据使用SHA-1算法求得一个hash值。 2. 用发送方的公钥对签名进行解密,获得摘要信息,并将这个摘要信息和自己求得的hash值进行对比,从而判断数据是否正确。

数字证书

数字证书的基本任务就是将一个公钥与安全个体(个人、公司等)的名字绑定在一起,并且负责颁发数字证书的这个机构叫作CA。这样的话我们就可以确保公钥的真实性。

SSL/TLS

SSL(Secure Sockets Layer,安全套接层),及其继任者 TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。

SSL协议可以分为两层:

  1. SSL记录协议:它建立在可靠的数据传输之上,为高层协议提供数据封装,压缩,加密等基本功能的支持。
  2. SSL握手协议:它建立在SSL记录之上,用于在实际的数据传输前就开始,通信双方进行身份验证,协商加密算法交换加密秘钥等。

HTTP的连接建立过程

  1. 根据输入的域名查找对应的ip地址。
    • 从浏览器缓存中查询
    • 在本机的hosts文件中查询
    • DNS缓存
    • DNS递归查询:如果本机的DNS服务器查询不到的话,那么就会以DNS客户的身份,向其他根域名服务器继续发送查询请求报文。
  2. 建立TCP连接
  3. 浏览器向服务器发送http请求
  4. 服务器接受到请求以后调用对应的处理器进行处理,并返回结果。
  5. 浏览器得到响应结果,进行页面渲染。

HTTP和HTTPS的区别

让我们来回顾一下计算机网络架构模型:

image.png

对我们的传统的HTTP协议,在数据传输的过程中从应用层就直接到运输层协议了,这个过程中数据是以数据包的形式进行传输的,并没有进行加密!但是HTTPS协议在表示层中还会经过一层SSL/TSL协议,专门用于对数据进行加密。所以说HTTPS其实就是加强版的HTTP。

既然要加密,那肯定涉及到数学运算,并且越复杂的加密系统,数据运算也越复杂,同理也会越耗费时间。所以说HTTPS虽然保证了数据的传输安全,但是数据传输的速度却比HTTP慢了很多,效率也降低了不少。

HTTPS的连接过程(使用了对称加密和非对称加密的方式)

  1. 浏览器向服务器发起连接请求,并把自己支持的加密算法一起携带过去。
  2. 服务器选择浏览器支持的加密算法,把自己的证书返回给浏览器。
  3. 浏览器验证证书是否有效。如果无效就断开连接,有效的话就在本机生成一串随机数秘钥,然后就证书中服务器的公钥对这串随机数进行非对称加密,再返回给服务器。
  4. 服务器用自己的私钥进行非对称解密,得到这个秘钥。
  5. 之后二者的数据传输都使用对称加密的方式进行加密。