常用对称加密主要有:凯撒密码(凑数), DES, 3DES, AES,本文介绍了这几种常见的加密方式,并对相关概念(ECB,CBC,CFB,OFB,CTR进行了介绍)。

[TOC]

概念

分组密码

分组密码(blockcipher)是每次只能处理特定长度的一块数据的一类密码算法,这里的一块”就称为分组(block)。此外,一个分组的比特数就称为分组长度(blocklength)。

例如,DES和三重DES的分组长度都是64bit。这些密码算法一次只能加密64bit的明文.并生成64bit的密文。

模式(ECB、CBC、CFB、OFB、CTR)

分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式(mode)

模式有很多种类,分组密码的主要模式有以下5种:

  • ECB模式:Electronic Code Book mode(电子密码本模式)
  • CBC模式:Cipher Block Chaining mode(密码分组链接模式)
  • CFB模式:Cipher FeedBack mode(密文反馈模式)
  • OFB模式:Output FeedBack mode(输出反馈模式)
  • CTR模式:CounTeR mode(计数器模式)

1.ECB 模式

ECB(Electronic Code Book, 电子密码本)模式是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。 每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是这种方法一旦有一个块被破解,使用相同的方法可以解密所有的明文数据,安全性比较差。 适用于数据较少的情形,加密前需要把明文数据填充到块大小的整倍数。

ecb-1

ecb-2

ecb-decrypt

使用ECB模式加密时,相同的明文分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的“明文分组–>密文分组”的对应表,因此ECB模式也称为电子密码本模式当最后一个明文分组的内容小于分组长度时,需要用一特定的数据进行填充(padding),让值一个分组长度等于分组长度

ECB模式是所有模式中最简单的一种。ECB模式中,明文分组与密文分组是一一对应的关系,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的密文分组。这样一来,只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式是存在一定风险的。

特点总结:

  • 需要填充长度到分组长度(如果不是分组单位的倍数)
  • 每个分组使用同样的加密方式,可以并行计算

与之相对的是,CBC模式每一个分组依赖前一个,安全性更高,但不能并行计算。

2. CBC 模式

CBC(Cipher Block Chaining, 密码块链)模式中每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密。 这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量IV进行异或操作。以为后一个分组需要依赖前一个分组的加密数据,一个接一个,所以形成了链,称之为 cipher block chaining。

CBC 模式的特点

  • 需要设置初始化向量 IV

  • 加密是连续的,不能并行处理

因为每一个分组都依赖前一个分组,所以必须前一个加密完才加密下一个,所以不能多个分组并行加密。

  • 与ECB一样消息块必须填充到块大小的整倍数。

3. CFB 模式

CFB模式的全称是Cipher FeedBack模式(密文反馈模式)。在CFB模式中,前一个分组的密文加密后和当前分组的明文XOR异或操作生成当前分组的密文

所谓反馈,这里指的就是返回输入端的意思,即前一个密文分组会被送回到密码算法的输入端。

CFB模式的解密和CBC模式的加密在流程上其实是非常相似的。

  • 同样需要 IV 向量作为第一个分组

  • 同样为链式,不可并行

加密过程: cfb-encrypt cfb-encrypt-en 解密过程: cfb-decrypt cfb-decrypt

我们使用一些标记来直观地对比两者的区别:

假定前一个分组的加密后密文数据为 $$ \D_{n-1}
$$

当前分组的明文为: $$ P_n $$ 当前分组的加密后密文为: $$ D_n $$

CFB模式: $$ D_{n-1} \begin{matrix}加密 \\{=>}\end{matrix}\^ P_n = Dn $$ CBC 模式: $$ D{n-1} \^ P_n \begin{matrix}加密 \\{=>}\end{matrix} = D_n $$

CFB 是对前一组密文加密后,再与Pn异或,得到这一组的密文

CBC 是对前一组密文与Pn异或后,再加密,得到这一组的密文

CFB模式与流密码

CFB模式是通过将“明文分组”与“密码算法的输出”进行XOR运算来生成“密文分组”的。

在CFB模式中,密码算法的输出相当于一个随机比特序列。由于密码算法的输出是通过计算得到的,并不是真正的随机数,因此CFB模式不可能具备理论上不可破译的性质。

CFB模式中由密算法所生成的比特序列称为密钥流(key stream)。在CFB模式中,密码算法就相当于用来生成密钥流的伪随机数生成器,而初始化向量相当于伪随机数生成器的“种子“。

在CFB模式中,明文数据可以被逐比特加密,因此我们可以将CFB模式看做是一种使用分组密码来实现流密码的方式

加密模式总结

mode

凯撒密码

凯撒密码的加密方式,即是将字符平移,解密时移动回来,如

caesar

平移三个字母,则密钥就是3

加密过程: $$ E_n(x) = (x+n) mod 26,即为密文 $$ 对明文右移 n 位后以 26取模,即为密文

解密过程: $$ D_n(x) = (x-n) mod 26 $$ 将密文左移 n位后以26取模,即为明文

可见凯撒密码作为最早的加密方式,非常容易暴力破解。

DES

DES(Data Encryption Standard)

DES一直以来被美国以及其他国家的政府和银行等广泛使用。然而,随着计算机的进步,现在DES已经能够被暴力破解,强度大不如前了。

RSA公司举办过破泽DES密钥的比赛(DESChallenge),我们可以看一看RSA公司官方公布的比赛结果:

  • 1997年的DES Challenge1中用了96天破译密钥
  • 1998年的DES ChallengeIl-I中用了41天破译密钥
  • 1998年的DES ChallengeII-2中用了56小时破译密钥
  • 1999年的DES ChallengeIll中只用了22小时15分钟破译密钥

从规格上来说,DES的密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实质上其密钥长度是56比特,也就是7个字节。 由于使用 64 bit作为一组对明文进行加密,所以 DES 属于分组密码加密

3DES

因为DES已经可以被快速地暴力破解,所以为了增强DES的加密强度,推出了3DES。3DES 即为DES三重加密。

3DES会将密钥分割成等分三份,所以,3DES的密钥长度是DES的三倍—24字节。

加密过程:

3des-encrypt

解密过程:

3des-decrypt

之所以要对明文进行 加密-解密-再加密这个流程,是为了兼容DES(解密同理)。如,上图密钥1==密钥2==密钥3的情况下,三重加解密之后与进行一次DES加解密完全相同。

特点:

  • 对明文进行了三次的运算,效率较低

AES

AES(Advanced Encryption Standard) 是取代其前任(DES)而成为新标准的一种对称加密算法。最终在2000年选用了比利时密码学家Joan Daemon 和 Vincent Rijmen 设计的 RijnDael 对称加密算法。

RijnDael 的分组长度是 128 比特,密钥长度可以在32bit~256bit 之间(但是在AES的标准中,秘钥长度只有 128、192、256三种)

AES 加密算法的特点:

  • 安全,效率高
  • 分组长度128bit
  • 密钥长度 16/24/32 Byte