个人博客
人类最较真、技艺最精湛的事业是军事,密码技术最大放异彩的地方也在军事,战争中需要通过无线电或其他手段来传达指令,如果指令被对方破解,那就相当于一举一动都暴露在对方面前,结果自然不言而喻。回到 IT 领域,在 Web 应用开发中,当涉及到安全时,会频繁地遇到密码技术相关的概念,有必要对其进行一个梳理,建立系统地认识。
密码技术的目标主要包括:
为了实现上述目标,最基本的工具有 6 种:
本篇先来看看对称加密。
众所周知,计算机虽然神通广大,但实际只认识 0/1,称为二进制。每一个被存放的 0/1 称为一个比特位,任何字符在计算机里都是通过一连串的比特位来表示并存放,这就是字符编码。最早的编码标准为标准 ASCII 编码,使用 8 个比特位的 0/1 组合来表示字符(首位为 0)。也就是说,从计算机的角度来看,所有由字符组成的信息都是一串比特位,因此用计算机实现的加密就是将明文的比特序列替换为密文的比特序列,解密则相反。
显然加解密就是对比特位进行运算,称为比特运算。比特运算和逻辑运算一样,都是在二值之间进行变换,在加密中常用的比特运算是异或(XOR)运算 —— 相同得 0,相异得 1。当比特位从 0 变为 1 或者从 1 变为 0,称为发生了比特翻转。
在目前的加密算法中有一个要素叫密钥,在对称加密中,加密和解密使用同一把密钥。密钥是一个比特位数很多(使得包含所有比特组合的密钥空间足够大,增加破解的难度)的随机数字,通常用 16 进制形式表示,使用密钥的比特序列与加密算法某一阶段生成的比特序列做异或,再经若干轮处理得到密文。
也就是说,最直观的加密方式就是一个密钥直接与明文做异或,如果密钥长度和明文长度一致,就称为一次性密码本,一次性密码本是最强的加密方式——由香农通过数学证明其是无法被破译的。但一次性密码本并不实用,因为密钥需要与明文长度一致,如果明文有100M,密钥也需要有100M,只有特别敏感的场景才可以不计成本地采用这种理论上绝对安全的加密方式。
目前常用的对称加密算法有:
上面介绍的 DES/3DES/AES/SM1/SM4/SM7 都是分组加密算法,所谓分组加密是指对超过密钥长度的数据进行加密时,一次只能加密一个固定长度的数据,这样就需要将数据切分为若干组,使用同一个密钥,一组一组地迭代进行加密,迭代的方式称为模式,主要有 ECB/CBC/CFB/OFB/CTR 5 种。除了分组加密算法,另一种使用场景比较少的算法类型叫流式加密算法,流式加密算法使用一个密钥流来进行加密,RC4、ZUC 就是流式加密算法。
主流的分组加密算法模式有:
ECB 模式直接将明文按分组长度切分为一个个独立的分组,对每个分组执行一样的加密操作。这种模式容易被攻击,如简单交换密文分组 1 和 2 的顺序就有可能构造出合法的带破坏性的信息,所以不推荐。
图中的【加密】省略了密钥和具体的加密步骤
CBC 模式的每个密文分组不再是独立的,因此通过交换密文分组位置的攻击方式不再有效。因为每一次分组在处理时需要用到前一个密文分组,所以在处理第一个明文分组之前加了一个初始向量 IV。CBC 的缺点是如果中间某个比特丢失,将导致后续的密文分组无法解密。推荐使用。
将明文分组与密码算法的输出做异或来得到密文,从全局来看,就是明文和一串密钥流做异或,结构类似于一次性密码本加密,只是密钥流不是真随机数。CFB 模式下可以逐比特加密,因此可以说是用分组密码方式实现了流密码。
和 CFB 类似,也是使用密码算法生成的密钥流来和明文分组异或,区别是密钥流的生成和密文分组没有关联,这使得生成密钥流和加密两个操作可以并行,密钥流实际上也可以提前生成好。
采用一个逐次累加的计数器来生成密钥流,生成密钥流和加密两个操作也可以并行。
参考: