深入理解HTTPS系列-密码学篇-对称加密(三)

537 阅读5分钟

前情提要

深入理解HTTPS系列-密码学篇-随机数(一)

深入理解HTTPS系列-密码学篇-哈希算法(二)

简介

为了保障通信的安全性,防止敏感信息的泄漏,在HTTPS通信中会对通信消息进行加密,加密算法主要有对称加密和非对称加密两种,本文重点介绍前者,对称加密算法是基于一个共享的密钥来进行加密和解密,所以也被称为共享密钥加密算法。

下面举一个简单的对称加密例子,假设有消息明文X,密钥Y,现对XY进行XOR异或加密得密文Z

明文X = 10101010
密钥Y = 10000001
密文Z = X XOR Y = 10101010 XOR 10000001 = 00101011

假设密文Z被截获,在不知道密钥Y的情况下,无论如何都无法得到明文X,反之如果拥有密钥,则再次XOR即可得明文

明文X = 密文Z XOR 密钥Y = 00101011 XOR 10000001 = 10101010

常见算法

按照加密方式的不同,对称加密算法可以划分为块密码流密码两种

  • 块密码:将明文划分为固定大小的数据块,对每个数据块分别加密
  • 流密码:逐位加密明文数据流。例如上述的例子就是采用的流密码算法

常见的对称加密算法如下

算法类型密钥长度(字节)分组长度(字节)说明
AES块密码128、192、256128目前最流行的对称加密算法
DES块密码5664是一种比较古老的对称加密算
3DES块密码128、168643DES是对DES算法的改进
RC4流密码可变长 推荐2048-RC4是一种流加密算法,它使用变长密钥,可以用于加密流式数据,如实时音频和视频流

实现原理

下面讲述下块密码算法的特性和实现原理。块密码算法具有以下几点特性:

  • 迭代模式:块密码算法会对明文数据进行分组,每个分组固定长度,然后依次迭代加密每个分组。块密码算法具有不同的迭代模式
  • 分组长度:分组长度和密钥长度无直接联系,算法安全性一般取决于密钥长度
  • 填充标准:如果明文长度不是分组长度的整数倍,需要按照一定的标准来填充最后一个分组

迭代模式

下面介绍几种常见的迭代模式

ECB

ECB模式(Electronic Codebook)是最简单的一种迭代模式,这种迭代模式是存在安全问题的,一般不建议使用

加密过程:分组单独加密然后组合成密文

解密过程:分组加密然后组合成明文

ECB模式一方面可以进行并行加密计算,速度较快,但它的主要问题在于安全性差,因为对于相同的明文和密钥得到密文一定是一样的,这增加了破解的风险

CBC

CBC模式(Cipher Block Chaining)是比较常见的一种迭代模式,解决了ECB模式的安全问题

加密过程:相比于ECB,增加了随机向量IV以及分组间的关联

解密过程:加密的逆过程

CBC模式的特点在于:

  • 由于存在一个随机的向量IV,这导致同一份明文和密钥,每次的加密结果都是不一样的,增加了安全性
  • 由于分组的加密依赖前一分组的结果,所以并行计算速度下降
  • 一般情况下初始化向量IV和密文是同时传输给解密者的,而且初始化向量是不加密的

CTR

CTR模式(counter)在迭代的时候,相当于是一个流密码的运行模式。每次迭代运算的时候要生成一个密钥流(keystream),生成密钥流的方法可以是任意的,但是各个密钥流之间是有关系的,最简单的方式就是密钥流不断递增,所以才叫作计数器模式

加密过程:CTR可以看做是ECB和CBC的结合体

  • 每个分组单独加密,可以提升加密速度
  • 引入Nonce密钥流,相当于是之前的IV向量和前一分组的密文值

解密过程:加密的逆向过程

这里的Nonce也是基于某种随机算法得到的随机值,很难被猜测,+0、+1表示密钥流是依次递增。且初始Nonce也是需要明文传递给解密方的

填充标准

填充标准解决最后一分组长度不一致问题,主要标准有PKCS#5PKCS#7。以PKCS#7为例,主要填充方式如下:

01            // 填充1字节
02 02         // 填充2字节
03 03 03      // 填充3字节
04 04 04 04   // 填充4字节

即如需要填充n个字节,则每个字节表示数字的就是n,所以PKCS#7标准的最大填充长度是255字节。PKCS#5PKCS#7类似,只不过PKCS#5的最大填充长度是8字节。AES算法分组长度128字节,所以需要采用PKCS#7填充标准

应用场景

在HTTPS加密场景中,对称加密应用的非常广泛,因为它最大的优势在于加密速度很快,同时也由于密钥分发存在“鸡生蛋 蛋生鸡”的问题,但这个在非对称加密章节会重点介绍如何解决了密钥传输问题

总结

本文介绍了加密算法的基本用法、实现原理以及常见种类,相信大家已经有一定了了解,欢迎在评论区多多留言交流~

对称加密具有运算快速,难破解的特点,但是它无法保障消息的完整性,下一章节我们将介绍下关于消息验证码算法是如何解决此问题的