【网络协议】网络协议系列十四 - (非)对称加密/数字签名/证书

很多开发人员经常听说加解密,但对其中原理不太了解,今天我们就一起探讨一下常用的加密原理。

一、对称加密

在对称加密中(也叫对称密码),加密和解密使用的是同一个密钥。

常见的对称加密算法:

  • DES
  • 3DES
  • AES

1.1. DES(Data Encryption Standard

DES是一种将64bit明文加密成64bit密文的对称加密算法,密钥长度是56bit。

规格上来说,密钥长度是64bit,但每隔7bit会设置一个用于错误检查的bit,因此密钥长度实质上是56bit。由于DES每次只能加密64bit的数据,遇到比较大的数据,需要对DES加密进行迭代(反复)。目前已经可以在短时间内被破解,所以不建议使用。

1.2. 3DES(Triple Data Encryption Algorithm

3DES,是将DES重复3次所得到的的一种密码算法,也叫做3重DES。

三重DES并不是进行三次DES加密(加密 -> 加密 -> 加密),而是加密 -> 解密 -> 加密的过程。目前还被一些银行等机构使用,但处理速度不高,安全性逐渐暴露出问题。

3个密钥都是不同的,也称为DES-EDE3。EDE是Encryption Decryption Encryption的缩写。

如果所有密钥都使用同一个,则结果与普通的DES是等价的。

如果密钥1、密钥3相同,密钥2不同,称为DES-EDE2。

1.3. AES(Advanced Encryption Standard

AES是取代DES成为新标准的一种对称加密算法,又称为Rijndael加密法(算法发明人叫做Rijndael)。

AES的密钥长度有128、192、256bit三种。目前AES已经逐步取代DES、3DES,成为首选的对称加密算法。

一般来说,我们也不应该去使用任何自制的密码算法,而是应该使用AES。因为它经过了全世界密码学家所进行的高品质验证工作。

1.4. 密钥配送问题

在使用对称加密时,一定会遇到密钥配送问题。

如果Alice将使用对称加密过的消息发给了Bob,只有将密钥发送给Bob,Bob才能完成解密。在发送密钥过程中,可能会被Eve窃取密钥,最后Eve也能完成解密。

如何解决密钥配送问题?
有以下几种解决密钥配送的方法:

  • 事先共享密钥(比如私下共享)
  • 密钥分配中心(Key Distribution Center,简称KDC)
  • Diffie-Hellman密钥交换
  • 非对称加密

二、非对称加密

在非对称加密(Asymmetric Cryptography)中,密钥分为加密密钥、解密密钥2种,它们并不是同一个密钥。

加密密钥:一般是公开的,因此该密钥称为公钥(public key)。因此,非对称加密也被称为公钥密码(Public-key Cryptography)。

解密密钥:由消息接收者自己保管的,不能公开,因此也称为私钥(private key)。

2.1. 公钥和私钥

公钥和私钥是一一对应的,不能单独生成。一对公钥和私钥统称为密钥对(key pair)。

由公钥加密的密文,必须使用与该公钥对应的私钥才能解密。

由私钥加密的密文,必须使用与该私钥对应的公钥才能解密。

因为非对称加密算法更加复杂(安全),所以加密解密速度会比较慢(效率低)。相反而言,对称加密简单(不安全),所以加密解密速度更快(效率高)。

2.2. 解决密钥配送问题

由消息的接收者生成一对公钥和私钥。将公钥发给消息的发送者,消息的发送者使用公钥加密消息。

2.3. RSA

RSA的名字由它的3位开发者姓氏首字母组成(Rivest、Adi Shamir、Leonard Adleman),也是目前使用最广泛的非对称加密算法。

2.4. 混合密码系统(Hybrid Cryptosystem

对称加密的缺点:不能很好地解决密钥配送问题(密钥会被窃取)。

非对称加密的缺点:加密解密速度比较慢。

混合密码系统:是将对称加密和非对称加密的优势相结合的方法。解决了非对称加密速度慢的问题,并通过非对称加密解决了对称加密的密钥配送问题。

网络上的密码通信所用的SSL/TLS都运用了混合密码系统。

2.4.1. 混合密码-加密

会话密钥(session key):

  • 为本次通信随机生成的临时密钥
  • 作为对称加密的密钥,用于加密消息,提高速度

加密步骤(发送消息):

  • 首先,消息发送者要拥有消息接收者的公钥
  • 生成会话密钥,作为对称加密的密钥,加密消息
  • 用消息接收者的公钥,加密会话密钥
  • 将前2步生成的加密结果,一并发给消息接收者

发送出去的内容包括:

  • 用会话密钥加密的消息(加密方法:对称加密)
  • 用公钥加密的会话密钥(加密方法:非对称加密)

2.4.2. 混合密码-解密

解密步骤(收到消息):

  • 消息接收者用自己的私钥解密出会话密钥
  • 再用第一步解密出来的会话密钥解密消息

2.4.2. 混合密码-加密解密流程

场景:Alice发送消息给Bob。

发送过程(加密过程):

  1. Bob先生成一对公钥和私钥
  2. Bob把公钥共享给Alice
  3. Alice随机生成一个会话密钥(临时密钥)
  4. Alice用会话密钥加密需要发送的消息(使用的是对称加密)
  5. Alice用Bob的公钥加密会话密钥(使用的是非对称加密)
  6. Alice把第4、5步的加密结果一并发送给Bob

接收过程(解密过程):

  1. Bob利用自己的私钥解密会话密钥(使用的是非对称加密算法进行解密)
  2. Bob利用会话密钥解密发送过来的消息(使用的是对称加密算法进行解密)

三、数字签名

例如,Alice发送内容给Bob(明文)。Alice发的内容有可能是被篡改的,或者有人伪装成Alice发消息,或者就是Alice发的,但她可以否认。

问题来了:Bob如何确定这段消息的真实性?如何识别篡改、伪装、否认?

解决方案:数字签名。

3.1. 数字签名过程

在数字签名技术中,有以下2种行为:

  • 生成签名
    • 由消息的发送者完成,通过“签名密钥”生成
  • 验证签名
    • 由消息的接收者完成,通过“验证密钥”验证

如何能保证这个签名是消息发送者自己签的?用消息发送者的私钥进行签名。

签名过程:

由于非对称加密速度比较慢,当消息体量比较大时效率就会下降,所以可以利用单向散列函数对其过程进行改进(对散列值进行加密解密,然后比较散列值):

消息发送者生成密钥对是为了防止密钥被篡改。消息接收者生成密钥对是不想消息被其他人看到。

  • 如果有人篡改了消息内容或签名内容,会是什么结果?

    • 签名验证失败,证明内容被篡改了。
  • 数字签名不能保证机密性?

    • 数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改。
  • 数字签名的作用

    • 确认消息的完整性
    • 识别消息是否被篡改
    • 防止消息发送人否认

3.2. 非对称加密和数字签名对比

在非对称加密中,任何人都可以使用公钥进行加密。

在数字签名中,任何人都可以使用公钥验证签名。

数字签名,其实就是将非对称加密反过来使用。

非对称加密:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密。公钥负责加密,私钥负责解密。

数字签名:既然是签名,肯定是不希望有人冒充我发消息,所以只有我才能签名。 私钥负责签名,公钥负责验签。

3.3. 公钥的合法性

如果遭遇了中间人攻击,那么公钥将可能是伪造的。

对称加密无法保证密钥的安全,后面有了非对称加密。但是非对称加密也有公钥被窃取的风险(混合加密和签名也是一样的,只要有传输公钥这一步骤,就会有窃取风险),所以如何才能验证公钥的合法性呢?使用证书。

四、证书

说到证书,首先联想到的是驾驶证、毕业证、英语四六级证等,这些都是由权威机构认证的。

密码学中的证书,全程叫公钥证书Public-key Certificate,PKC),跟驾驶证类似,里面有姓名、邮箱等个人信息,以及此人的公钥。并由认证机构(Certificate Authority,CA)进行数字签名。

CA就是能够认定“公钥确实属于此人”并能够生成数字签名的个人或者组织。

CA可以是有国际性的组织、政府设立的组织、通过提供认证服务来盈利的企业,个人也可以成立认证机构。

4.1. 注册和下载

4.2. 证书的使用

第4步和第5步只要被篡改,就会认证失败。因为证书签名始终都是围绕CA认证机构验证的。

各大CA的公钥,默认已经内置在浏览器和操作系统中。

4.3. 查看证书

4.3.1. Windows

  1. Windows + R -> 输入mmc
  2. 文件 -> 添加/删除管理单元
  3. 证书 -> 添加 -> 我的用户账户 -> 完成 -> 确定

4.3.2. Mac

Mac系统的证书统一在钥匙串中管理。