作者: Alex Wood 译者: LCTT Andy Song
学习密码学背后的基本概念,主要是保密性、完整性和身份认证 。
安全通信正快速成为当今互联网的规范 。从 2018 年 7 月起,google Chrome 将对全部使用 HTTP 传输(而不是 HTTPS 传输)的站点开始显示“不安全”警告 。虽然密码学已经逐渐变广为人知,但其本身并没有变得更容易理解 。Let's Encrypt 设计并实现了一套令人惊叹的解决方案,可以提供免费安全证书和周期性续签;但如果不了解底层概念和缺陷,你也不过是加入了类似“货物崇拜cargo cult”的技术崇拜的程序员大军 。
安全通信的特性
密码学最直观明显的目标是保密性confidentiality:消息message传输过程中不会被窥探内容 。为了保密性,我们对消息进行加密:对于给定消息,我们结合一个密钥key生成一个无意义的乱码,只有通过相同的密钥逆转加密过程(即解密过程)才能将其转换为可读的消息 。假设我们有两个朋友 Alice 和 Bob,以及他们的八卦nosy邻居 Eve 。Alice 加密类似 "Eve 很讨厌" 的消息,将其发送给 Bob,期间不用担心 Eve 会窥探到这条消息的内容 。
对于真正的安全通信,保密性是不够的 。假如 Eve 收集了足够多 Alice 和 Bob 之间的消息,发现单词 “Eve” 被加密为 "Xyzzy" 。除此之外,Eve 还知道 Alice 和 Bob 正在准备一个派对,Alice 会将访客名单发送给 Bob 。如果 Eve 拦截了消息并将 “Xyzzy” 加到访客列表的末尾,那么她已经成功的破坏了这个派对 。因此,Alice 和 Bob 需要他们之间的通信可以提供完整性integrity:消息应该不会被篡改 。
而且我们还有一个问题有待解决 。假如 Eve 观察到 Bob 打开了标记为“来自 Alice”的信封,信封中包含一条来自 Alice 的消息“再买一加仑冰淇淋” 。Eve 看到 Bob 外出,回家时带着冰淇淋,这样虽然 Eve 并不知道消息的完整内容,但她对消息有了大致的了解 。Bob 将上述消息丢弃,但 Eve 找出了它并在下一周中的每一天都向 Bob 的邮箱中投递一封标记为“来自 Alice”的信封,内容拷贝自之前 Bob 丢弃的那封信 。这样到了派对的时候,冰淇淋严重超量;派对当晚结束后,Bob 分发剩余的冰淇淋,Eve 带着免费的冰淇淋回到家 。消息是加密的,完整性也没问题,但 Bob 被误导了,没有认出发信人的真实身份 。身份认证Authentication这个特性用于保证你正在通信的人的确是其声称的那样 。
信息安全还有其它特性,但保密性、完整性和身份验证是你必须了解的三大特性 。
加密和加密算法
加密都包含哪些部分呢?首先,需要一条消息,我们称之为明文plaintext 。接着,需要对明文做一些格式上的初始化,以便用于后续的加密过程(例如,假如我们使用分组加密算法block cipher,需要在明文尾部填充使其达到特定长度) 。下一步,需要一个保密的比特序列,我们称之为密钥key 。然后,基于私钥,使用一种加密算法将明文转换为密文ciphertext 。密文看上去像是随机噪声,只有通过相同的加密算法和相同的密钥(在后面提到的非对称加密算法情况下,是另一个数学上相关的密钥)才能恢复为明文 。
(LCTT 译注:cipher 一般被翻译为密码,但其具体表达的意思是加密算法,这里采用加密算法的翻译)
加密算法使用密钥加密明文 。考虑到希望能够解密密文,我们用到的加密算法也必须是可逆的reversible 。作为简单示例,我们可以使用 XOR 。该算子可逆,而且逆算子就是本身(P ^ K = C; C ^ K = P),故可同时用于加密和解密 。该算子的平凡应用可以是一次性密码本one-time pad,不过一般而言并不可行 。但可以将 XOR 与一个基于单个密钥生成任意随机数据流arbitrary stream of random data的函数结合起来 。现代加密算法 AES 和 Chacha20 就是这么设计的 。
我们把加密和解密使用同一个密钥的加密算法称为对称加密算法symmetric cipher 。对称加密算法分为流加密算法stream ciphers和分组加密算法两类 。流加密算法依次对明文中的每个比特或字节进行加密 。例如,我们上面提到的 XOR 加密算法就是一个流加密算法 。流加密算法适用于明文长度未知的情形,例如数据从管道或 socket 传入 。RC4 是最为人知的流加密算法,但在多种不同的攻击面前比较脆弱,以至于最新版本 (1.3)的 TLS (“HTTPS” 中的 “S”)已经不再支持该加密算法 。Efforts 正着手创建新的加密算法,候选算法 ChaCha20 已经被 TLS 支持 。
分组加密算法对固定长度的分组,使用固定长度的密钥加密 。在分组加密算法领域,排行第一的是 先进加密标准Advanced Encryption Standard(AES),使用的分组长度为 128 比特 。分组包含的数据并不多,因而分组加密算法包含一个工作模式,用于描述如何对任意长度的明文执行分组加密 。最简单的工作模式是 电子密码本Electronic Code Book(ECB),将明文按分组大小划分成多个分组(在必要情况下,填充最后一个分组),使用密钥独立的加密各个分组 。
推荐阅读
- 算法--平衡二叉树AVL原理分析以及代码实现
- Mac降级重装必备 | MacOS 制作启动U盘及安装方法
- 白术养殖方法及注意事项
- 【电灯开关】电灯开关的品牌及安装
- 浅谈java事务及隔离级别
- 用PHP实现遍历删除目录及此目录下存放的所有文件
- 光控开关的原理及应用
- 华为路由器ospf的路由控制及安全
- 南方礼仪中的茶俗及其创新
- 茶具名称及功夫茶具使用说明