前情提要
简介
为了保障通信的安全性,防止敏感信息的泄漏,在HTTPS通信中会对通信消息进行加密,加密算法主要有对称加密和非对称加密两种,本文重点介绍前者,对称加密算法是基于一个共享的密钥来进行加密和解密,所以也被称为共享密钥加密算法。
下面举一个简单的对称加密例子,假设有消息明文X,密钥Y,现对X和Y进行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、256 | 128 | 目前最流行的对称加密算法 |
| DES | 块密码 | 56 | 64 | 是一种比较古老的对称加密算 |
| 3DES | 块密码 | 128、168 | 64 | 3DES是对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#5和PKCS#7。以PKCS#7为例,主要填充方式如下:
01 // 填充1字节
02 02 // 填充2字节
03 03 03 // 填充3字节
04 04 04 04 // 填充4字节
即如需要填充n个字节,则每个字节表示数字的就是n,所以PKCS#7标准的最大填充长度是255字节。PKCS#5和PKCS#7类似,只不过PKCS#5的最大填充长度是8字节。AES算法分组长度128字节,所以需要采用PKCS#7填充标准
应用场景
在HTTPS加密场景中,对称加密应用的非常广泛,因为它最大的优势在于加密速度很快,同时也由于密钥分发存在“鸡生蛋 蛋生鸡”的问题,但这个在非对称加密章节会重点介绍如何解决了密钥传输问题
总结
本文介绍了加密算法的基本用法、实现原理以及常见种类,相信大家已经有一定了了解,欢迎在评论区多多留言交流~
对称加密具有运算快速,难破解的特点,但是它无法保障消息的完整性,下一章节我们将介绍下关于消息验证码算法是如何解决此问题的