人类最较真、技艺最精湛的事业是军事,密码技术最大放异彩的地方也在军事,战争中需要通过无线电或其他手段来传达指令,如果指令被对方破解,那就相当于一举一动都暴露在对方眼前,结果自然不言而喻。回到 IT 领域,在 Web 应用开发中,当涉及到安全时,会频繁地遇到密码技术相关的概念,有必要对其进行一个梳理,建立一个大体地系统化认识。

密码技术的目标主要包括:

  • 提供身份认证
  • 提供机密性保障
  • 提供完整性保障
  • 提供不可否认性保障

为了实现上述目标,最基本的工具有 6 种:

  • 对称加密,提供 ②;
  • 非对称加密,提供 ②;
  • 单向散列,提供 ③;
  • 消息认证码,提供 ①③;
  • 数字签名,提供 ①③④;
  • 伪随机数生成器,不可或缺的要素。

本篇先来看看对称加密。

众所周知,计算机虽然神通广大,但实际只认识 0/1,称为二进制。每一个被存放的 0/1 称为一个比特位,任何字符在计算机里都是通过一连串的比特位来表示并存放,这就是字符编码。最早的编码标准为标准 ASCII 编码,使用 8 个比特位的 0/1 组合来表示字符(首位为 0)。也就是说,从计算机的角度来看,所有由字符组成的信息都是一串比特位,因此用计算机实现的加密就是将明文的比特序列替换为密文的比特序列,解密则相反

显然加解密就是对比特位进行运算,称为比特运算。比特运算和逻辑运算一样,都是在二值之间进行变换,在加密中常用的比特运算是异或(XOR)运算 —— 相同得 0,相异得 1。当比特位从 0 变为 1 或者从 1 变为 0,称为比特翻转。

在目前的加密算法中有一个要素叫密钥,在对称加密中,加密和解密使用同一把密钥。密钥是一个比特位数很多(使得包含所有比特组合的密钥空间足够大,增加破解的难度)的随机数字,通常用 16 进制形式表示,使用密钥的比特序列与加密算法某一阶段生成的比特序列做异或,再经若干轮处理得到密文。

也就是说,最直观的加密方式就是一个密钥直接与明文做异或,如果密钥(真随机数)长度和明文长度一致,就称为一次性密码本,一次性密码本是最强的加密方式——由香农用数学证明其无法被破译。但一次性密码本并不实用,因为密钥配送、保存、重用都存在麻烦,且密钥需要与明文长度一致,如果明文有100M,密钥也需要有100M,只有特别敏感的场景才可以不计成本地采用这种理论上绝对安全的加密方式。

目前常用的对称加密算法有:

  • DESData Encryption Standard),是 1977 年美国联邦信息处理标准(FIPS)中采用的一种密码,密钥长度为 64 比特(其中每隔 7 比特会设置一个错误检查比特),已经可以在短时间内破解,所以不推荐使用
  • 3DES,DES 的加强版,需要三个 DES 密钥,执行过程为 DES 加密→ ② DES 解密→ ③ DES 加密,三个密钥分别用于三个步骤中,如果三个密钥相同则等价于普通 DES 加密,如果 ①③ 相同就称为 DES-EDE2,如果三个密钥都不同就称为 DES-EDE3;
  • AESAdvanced Encryption Standard),由美国标准化组织 NIST 组织的算法选拔活动的产物,该活动面向全世界的密码学家,参与选拔的算法一旦被密码学家找到弱点就直接淘汰,最终胜出的算法为 Rijndael,算法用到的密钥长度可以有 128/192/256 三种选择,AES 的安全性很高,所以目前推荐使用
  • SM1/SM4/SM7/ZUC,商密标准的对称加密算法,密钥长度为 128 比特。

上面介绍的 DES/3DES/AES/SM1/SM4/SM7 都是分组加密算法,所谓分组加密是指对超过密钥长度的数据进行加密时,一次只能加密一个固定长度的数据,这样就需要将数据切分为若干组,使用同一个密钥,一组一组地迭代进行加密,迭代的方式称为模式,主要有 ECB/CBC/CFB/OFB/CTR 5 种。除了分组加密算法,另一种使用场景比较少的算法类型叫流式加密算法,流式加密算法使用一个密钥流来进行加密,RC4、ZUC 就是流式加密算法。

ECB(Electronic CodeBook)

ECB 模式直接将明文按分组长度切分为一个个独立的分组,对每个分组执行一样的加密操作。这种模式容易被攻击,如简单交换密文分组 1 和 2 的顺序就有可能构造出合法的带破坏性的信息,所以不推荐

图中的【加密】省略了密钥和具体的加密步骤

CBC(Cipher Block Chaining)

CBC 模式的每个密文分组不再是独立的,因此通过交换密文分组位置的攻击方式不再有效。因为每一次分组在处理时需要用到前一个密文分组,所以在处理第一个明文分组之前加了一个初始向量 IV。CBC 的缺点是如果中间某个比特丢失,将导致后续的密文分组无法解密。从安全性来说推荐使用


CFB(Cipher FeedBack)

将明文分组与密码算法的输出做异或来得到密文,从全局来看,就是明文和一串密钥流做异或,结构类似于一次性密码本加密,只是密钥流不是真随机数。CFB 模式下可以逐比特加密,因此可以说是用分组密码方式实现了流密码。


OFB(Output-Feedback)

和 CFB 类似,也是使用密码算法生成的密钥流来和明文分组异或,区别是密钥流的生成和密文分组没有关联,这使得生成密钥流和加密两个操作可以并行,密钥流实际上也可以提前生成好。


CTR(Counter)

和 OFB 类似,采用一个逐次累加的计数器来生成密钥流,生成密钥流和加密两个操作也可以并行。


参考:


0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注