第 1 章 环游密码世界

第 1 章 环游密码世界

1.1 本章学习的内容

与密码相关的技术种类繁多,而且它们之间有着紧密的关联。本章中,让我们暂且抛开那些繁琐的细节,先来从整体上了解一下密码世界究竟是个什么样子吧。

1.2 密码

1.2.1 Alice 与 Bob

要讲解密码,我们需要为参与信息交互的人和计算机起几个名字。如果光用 A、B 之类的符号未免显得无趣,因此在本书中我们用 Alice、Bob 等人名来指代这些信息交互的参与者(表 1-1)。

表 1-1 本书中的主要角色一览

名称

说明

Alice

一般角色

Bob

一般角色

Eve

窃听者,可窃听通信内容

Mallory

主动攻击者,可妨碍通信、伪造消息等

Trent

可信的第三方

Victor

验证者

1.2.2 发送者、接收者和窃听者

请想象一下 Alice 向 Bob 发送电子邮件的场景。在这个场景中,发出邮件的 Alice 称为发送者(sender),而收到邮件的 Bob 则称为接收者(receiver)。

在讲解发送者、接收者的概念时,用邮件这个例子会比较便于理解,但实际上发送者和接收者这两个术语的使用范围并不仅仅局限于邮件。当某个人向另一个人发送信息时,发出信息的人称为发送者,而收到信息的人称为接收者。另外,被发送的信息有时也统称为消息(message)(图 1-1)。

图 1-1 Alice 向 Bob 发送邮件(发送者、接收者)

邮件是通过互联网从 Alice 的计算机发送到 Bob 的计算机的。在发送邮件时,邮件会经过许多台计算机和通信设备进行中转,在这个过程中,就存在被恶意窃听者(eavesdropper)偷看到的可能性(图 1-2)。

图 1-2 Eve 看到邮件内容(窃听者)

由于窃听者的英文叫作 eavesdropper,因此我们给他起了一个发音相近的名字叫作 Eve

窃听者 Eve 并不一定是人类,有可能是安装在通信设备上的某种窃听器,也可能是安装在邮件软件和邮件服务器上的某些程序。

尽管邮件内容原本应该只有发送者和接收者两个人知道,但如果不采取相应的对策,就存在被第三方知道的风险。

1.2.3 加密与解密

Alice 不想让别人看到邮件的内容,于是她决定将邮件进行加密(encrypt)后再发送出去。

加密之前的消息称为明文(plaintext),加密之后的消息称为密文(ciphertext)。

我们看到明文可以理解其中的含义,而看到密文则无法理解其中的含义。

图 1-3 明文被加密之后,就会变成看不懂的密文

Bob 收到了来自 Alice 的加密邮件,但作为接收者的 Bob 也是无法直接阅读密文的,于是 Bob 需要对密文进行解密(decrypt)之后再阅读。解密就是将密文恢复成明文的过程。

图 1-4 密文被解密之后,就变回原来的明文了

将消息加密后发送的话,即使消息被窃听,窃听者得到的也只是密文,而无法得知加密前的明文内容。

图 1-5 将消息加密后发送的话,窃听者只能得到密文

1.2.4 密码保证了消息的机密性

在上述场景中,Alice 将邮件进行加密,而 Bob 则进行解密,这样做的目的,是为了不让窃听者 Eve 读取邮件的内容。Alice 和 Bob 通过运用密码(cryptography)技术,保证了邮件的机密性(confidentiality)。

1.2.5 破译

进行加密之后,Eve 只能得到密文。如果 Eve 无论如何都想知道明文的内容,就需要采取某种手段将密文还原为明文。

正当的接收者将密文还原为明文称为“解密”,但接收者以外的其他人试图将密文还原为明文,则称为密码破译(cryptanalysis),简称为破译,有时也称为密码分析

进行破译的人称为破译者(cryptanalyst)。破译者并不一定是坏人,密码学研究者为了研究密码强度(即破译密码的困难程度),也经常需要对密码进行破译,在这样的情况下,研究者也会成为破译者。

小测验 1 日记的密码      (答案见1.9 节)

Alice 习惯用文字处理软件来写日记。为了不让别人看到,她在每次保存到磁盘时都会进行加密,而在阅读日记时,再进行解密。

在这个场景中,发送者和接收者分别是谁呢?

1.3 对称密码与公钥密码

1.3.1 密码算法

用于解决复杂问题的步骤,通常称为算法(algorithm)。从明文生成密文的步骤,也就是加密的步骤,称为“加密算法”,而解密的步骤则称为“解密算法”。加密、解密的算法合在一起统称为密码算法

1.3.2 密钥

密码算法中需要密钥(key)。现实世界中的“钥”,是像 这样的形状微妙而复杂的小金属片。然而,密码算法中的密钥,则是像 203554728568477650354673080689430768 这样的一串非常大的数字。

图 1-6 加密、解密与密钥

无论是在加密时还是在解密时,都需要知道密钥。

正如保险柜的钥匙可以保护保险柜中存放的贵重物品一样,密码中的密钥可以保护你的重要数据。即使保险箱再坚固,如果钥匙被盗,则里面的贵重物品也会被盗。同样地,我们也必须注意不要让密码的密钥被他人窃取。

关于密钥,我们将在第 3 章详细讲解。

1.3.3 对称密码与公钥密码

根据密钥的使用方法,可以将密码分为对称密码和公钥密码两种。

对称密码(symmetric cryptography)是指在加密和解密时使用同一密钥的方式 1

1对称密码有多种别名,如公共密钥密码(common-key cryptography)、传统密码(conventional cryptography)、私钥密码(secret-key cryptography)、共享密钥密码(shared-key cryptography)等。

关于对称密码,我们将在第 3 章和第 4 章详细讲解。

公钥密码(public-key cryptography)则是指在加密和解密时使用不同密钥的方式。因此,公钥密码又称为非对称密码(asymmetric cryptography)。

图 1-7 对称密码与公钥密码

公钥密码是在 20 世纪 70 年代出现的,这种方法在密码学界引发了一场重大变革。现代计算机和互联网中的安全体系,很大程度上都依赖于公钥密码。

关于公钥密码,我们将在第 5 章详细讲解。

1.3.4 混合密码系统

将对称密码和公钥密码结合起来的密码方式称为混合密码系统(hybrid cryptosystem),这种系统结合了对称密码和公钥密码两者的优势。

关于混合密码系统,我们将在第 6 章详细讲解。

1.4 其他密码技术

密码技术所提供的并不仅仅是基于密码的机密性,用于检验消息是否被篡改的完整性、以及用于确认对方是否是本人的认证等都是密码技术的重要部分。

1.4.1 单向散列函数

我们想象一下通过互联网下载免费软件的场景。我们所下载的软件,是否和软件的作者所制作的东西一模一样呢?会不会有坏人在软件里植入了一些恶意程序呢?

为了防止软件被篡改,有安全意识的软件发布者会在发布软件的同时发布该软件的散列值 2。散列值就是用单向散列函数(one-way hash function)计算出来的数值。

2散列值(hash)又称哈希值密码校验和(cryptographic checksum)、指纹(fingerprint)、消息摘要(message digest)。

下载该软件的人可以自行计算所下载文件的散列值,然后与软件发布者公布的散列值进行对比。如果两个散列值一致,就说明下载的文件与发布者所发布的文件是相同的。

单向散列函数所保证的并不是机密性,而是完整性(integrity)。完整性指的是“数据是正牌的而不是伪造的”这一性质。使用单向散列函数,就可以检测出数据是否被篡改过。

单向散列函数是一种保证完整性的密码技术。关于单向散列函数,我们将在第 7 章详细讲解。

1.4.2 消息认证码

为了确认消息是否来自所期望的通信对象,可以使用消息认证码(message authentication code)技术。

通过使用消息认证码,不但能够确认消息是否被篡改,而且能够确认消息是否来自所期待的通信对象。也就是说,消息认证码不仅能够保证完整性,还能够提供认证(authentication)机制。

消息认证码是一种能够保证完整性和提供认证的密码技术。关于消息认证码,我们将在第 8 章详细讲解。

1.4.3 数字签名

Bob 刚刚收到了一封来自 Alice 的邮件,内容是“以 100 万元的价格购买该商品”。

不过,这封邮件到底是不是 Alice 本人写的呢?Bob 仅通过阅读邮件内容,是否能够判断该邮件确实来自 Alice 呢?邮件的发送者(From: 一栏的内容)很容易被伪造,因此确实存在别人伪装(spoofing)成 Alice 的风险。

假设 Alice 真的发出过邮件,但是 Alice 当初写的内容真的是“以 100 万元的价格购买该商品”吗?是否存在这样一种风险,即 Alice 原本写的是“1 万元”,而在邮件传输的过程中被某些别有用心的人进行了篡改,将 1 万元改成了 100 万元呢?

反过来说,还有这样一种风险,即 Alice 真的向 Bob 发送了内容为“以 100 万元的价格购买该商品”的邮件,但后来 Alice 又不想买了,于是便谎称“我当初根本没发过那封邮件”。像这样事后推翻自己先前主张的行为,称为否认(repudiation)。

能够防止上述伪装、篡改和否认等威胁的技术,就是数字签名(digital signature)。数字签名就是一种将现实世界中的签名和盖章移植到数字世界中的技术,它也是一种重要的密码技术。

用刚才的例子来说,Alice 可以对“以 100 万元的价格购买该商品”的内容加上数字签名后再通过邮件发送,而 Bob 则可以对该数字签名进行验证(verify)。通过这样的方式,不但可以

检测出伪装和篡改,还能够防止事后否认。数字签名是一种能够确保完整性、提供认证并防止否认的密码技术。关于数字签名,我们将在第 9 章详细讲解。

1.4.4 伪随机数生成器

伪随机数生成器(Pseudo Random Number Generator,PRNG)是一种能够模拟产生随机数列的算法。随机数和密码技术有关,这样说大家可能会感到意外,但实际上随机数确实承担着密钥生成的重要职责。例如在 Web 中进行 SSL/TLS 通信时,会生成一个仅用于当前通信的临时密钥(会话密钥),这个密钥就是基于伪随机数生成器生成的。如果生成随机数的算法不好,窃听者就能够推测出密钥,从而带来通信机密性下降的风险。

关于伪随机数生成器以及随机数的话题,我们将在第 12 章详细讲解。

1.5 密码学家的工具箱

在以上内容中,已经出现了很多种类的密码技术,其中以下六种发挥着尤其重要的作用:

  • 对称密码
  • 公钥密码
  • 单向散列函数
  • 消息认证码
  • 数字签名
  • 伪随机数生成器

在本书中,我们将上述六种技术统称为密码学家的工具箱 3

3“密码学家的工具箱”这一说法出自《网络信息安全的真相》(Secrets and Lies: Digital Security in a Networked World),布鲁斯·施奈尔,2000。中文版由机械工业出版社 2001 年 9 月出版,吴世忠、马芳译。——译者注

为了梳理之前讲过的内容,我们将信息安全所面临的威胁与用来应对这些威胁的密码技术之间的关系用一张图表来表示出来(图 1-8)。

图 1-8 信息安全所面临的威胁与应对这些威胁的密码技术

1.6 隐写术与数字水印

上面我们已经讲过,密码是一种能够让消息内容变得无法解读的技术,英文叫作 cryptography。

除此之外,其实还有另外一种技术,它不是让消息内容变得无法解读,而是能够隐藏消息本身,这种技术称为隐写术(steganography)。

我们来看一个简单的例子。

我们先准备一段话,
很容易看懂的就可以,
喜闻乐见的当然更好。
欢迎你尝试将另一句话嵌在这段话中,
你会发现这其实就是一种隐写术。

上面这段话其实就是隐写术的一个例子,我们将每一行的第一个字拿出来看一看。

——我们先准备一段话,
——很容易看懂的就可以,
——喜闻乐见的当然更好。
——欢迎你尝试将另一句话嵌在这段话中,
——你会发现这其实就是一种隐写术。

这样我们就会发现,原来上面这段话中还隐藏着另一句话——“我很喜欢你”。

隐写术的目的是隐藏消息本身,但如果搞清楚了嵌入消息的方法,也就可以搞清楚消息的内容。因此,隐写术并不能代替密码。

隐写术在计算机中也有一定的应用,例如最近的数字水印技术就运用了隐写术的方法。数字水印是一种将著作权拥有者及购买者的信息嵌入文件中的技术。但是仅凭数字水印技术是无法对信息进行保密的,因此需要和其他技术配合使用。

例如,将密码和隐写术相结合的方法就很常用。首先,我们将要嵌入的文章进行加密并生成密文,然后再通过隐写术将密文隐藏到图片中。这样一来,即便有人发现了密文的存在,也无法读取出所嵌入的文章的内容。

密码隐藏的是内容,隐写术隐藏的是消息本身。通过将密码与隐写术相结合,就可以同时产生两者所各自具备的效果。

1.7 密码与信息安全常识

在继续下面的内容之前,我们先来介绍一些关于密码的常识。刚刚开始学习密码的人常常会对以下这几条感到不可思议,因为它们有悖于我们的一般性常识。

  • 不要使用保密的密码算法
  • 使用低强度的密码比不进行任何加密更危险
  • 任何密码总有一天都会被破解
  • 密码只是信息安全的一部分

1.7.1 不要使用保密的密码算法

很多企业都有下面这样的想法:

“由公司自己开发一种密码算法,并将这种算法保密,这样就能保证安全。”

然而,这样的想法却是大错特错,使用保密的密码算法是无法获得高安全性的。

我们不应该制作或使用任何保密的密码算法,而是应该使用那些已经公开的、被公认为强度较高的密码算法。

这样做的原因主要有以下两点。

密码算法的秘密早晚会公诸于世

从历史上看,密码算法的秘密最终无一例外地都会被暴露出来。1999 年,DVD 的密码算法被破解。2007 年,NXP 的非接触式 IC 卡 MIFARE Classic 的密码算法被破解。这些算法最初都是保密的,然而研究者可以通过逆向工程的手段对其进行分析,并找到漏洞进行破解。RSA 公司开发的 RC4 密码算法曾经也是保密的,但最终还是有一位匿名人士开发并公开了与其等效的程序。

一旦密码算法的详细信息被暴露,依靠对密码算法本身进行保密来确保机密性的密码系统也就土崩瓦解了。反之,那些公开的算法从一开始就没有设想过要保密,因此算法的暴露丝毫不会削弱它们的强度。

开发高强度的密码算法是非常困难的

要比较密码算法的强弱是极其困难的,因为密码算法的强度并不像数学那样可以进行严密的证明。密码算法的强度只能通过事实来证明,如果专业密码破译者经过数年的尝试仍然没有破解某个密码算法,则说明这种算法的强度较高。

稍微聪明一点的程序员很容易就能够编写出“自己的密码系统”。这样的密码在外行看来貌似牢不可破,但在专业密码破译者的眼里,要破解这样的密码几乎是手到擒来。

现在世界上公开的被认为强度较高的密码算法,几乎都是经过密码破译者长期尝试破解未果而存活下来的。因此,如果认为“公司自己开发的密码系统比那些公开的密码系统更强”,那只能说是过于高估自己公司的能力了。

试图通过对密码算法本身进行保密来确保安全性的行为,一般称为隐蔽式安全性(security by obscurity),这种行为是危险且愚蠢的。

反过来说,将密码算法的详细信息以及程序源代码全部交给专业密码破译者,并且为其提供大量的明文和密文样本,如果在这样的情况下破译一段新的密文依然需要花上相当长的时间,就说明这是高强度的密码。

1.7.2 使用低强度的密码比不进行任何加密更危险

一般人们会认为:就算密码的强度再低,也比完全不加密要强吧?其实这样的想法是非常危险的。

正确的想法应该是:与其使用低强度的密码,还不如从一开始就不使用任何密码 4

4出自《密码故事》(The Code Book: The History and Exploration),西蒙·辛格,1999,p.72。中文版由海南出版社 2001 年 10 月出版,朱小蓬等译。——译者注

这主要是由于用户容易通过“密码”这个词获得一种“错误的安全感”。对于用户来说,安全感与密码的强度无关,而只是由“信息已经被加密了”这一事实产生的,而这通常会导致用户在处理一些机密信息的时候麻痹大意。

早在 16 世纪,当时的苏格兰女王玛丽就曾认为没有人能够破译自己使用的密码。正是由于对密码的盲信,她将刺杀伊丽莎白女王的计划明明白白地写在了密信中,结果密码遭到破译,玛丽也因此被送上了断头台。

1.7.3 任何密码总有一天都会被破解

如果某种密码产品宣称“本产品使用了绝对不会被破解的密码算法”,那么你就要对这个产品的安全性打个问号了,这是因为绝对不会被破解的密码是不存在的。

无论使用任何密码算法所生成的密文,只要将所有可能的密钥全部尝试一遍,就总有一天可以破译出来。因此,破译密文所需要花费的时间,与要保密的明文的价值之间的权衡就显得非常重要。

严格来说,绝对不会被破解的密码算法其实是存在的,这种算法称为一次性密码本(one-time pad),但它并不是一种现实可用的算法。关于这个话题,我们会在 3.4 节详细探讨。

此外,还有另外一种技术被认为有可能造就完美的密码技术,那就是量子密码。关于量子密码,我们会在 15.4.1 节进行介绍。

1.7.4 密码只是信息安全的一部分

我们还是回到 Alice 给 Bob 发送加密邮件的例子。即便不去破解密码算法,也依然有很多方法能够知道 Alice 所发送的邮件内容。

例如,攻击者可以不去试图破译经过加密的邮件,而是转而攻击 Alice 的电脑以获取加密之前的邮件明文。

最近,社会工程学(social engineering)攻击开始流行起来。例如,办公室的内线电话响起,电话里说:“你好,我是 IT 部。由于需要对您的电脑进行安全检查,请您将密码临时改为 XR2315。”而实际上拨打电话的有可能就是一名攻击者。

上面提到的这些攻击手段,都与密码的强度毫无关系。

要保证良好的安全性,就需要理解“系统”这一概念本身的性质。复杂的系统就像一根由无数个环节相连组成的链条,如果用力拉,链条就会从其中最脆弱的环节处断开。因此,系统的强度取决于其中最脆弱的环节的强度。

最脆弱的环节并不是密码,而是人类自己。关于这个话题,我们会在最后一章进行深入的思考。

1.8 本章小结

本章我们浏览了密码世界中的一些主要技术,同时还接触了一些密码界中的“常识”。

在后面的章节中,我们会更深入地学习这些技术。在此之前,让我们先来回顾一下历史上曾经使用过的密码吧。

小测验 2 基础知识确认      (答案见1.9 节)

下列说法中,请在正确的旁边画○,错误的旁边画×。

(1) 将明文转换为密文的过程称为加密。

(2) 明文是供人类读取的数据,而密文则是供计算机读取的数据。

(3) 只要检查邮件发送者(From:)一栏的内容,就能够正确判断邮件是谁发出的。

(4) 在对称密码中,加密用的密钥和解密用的密钥是相同的。

(5) 公开的密码算法容易遭到坏人的攻击,因此使用自己公司开发的保密的密码算法更安全。

1.9 小测验的答案

小测验 1 的答案:日记的密码(1.2.5 节)

发送者和接收者都是 Alice。

准确地说,发送者是加密时的 Alice,而接收者是解密时的 Alice,也就是说,Alice 是将密文发送给了未来的自己。

小测验 2 的答案:基础知识确认(1.8 节)

○ (1) 将明文转换为密文的过程称为加密。

× (2) 明文是供人类读取的数据,而密文是供计算机读取的数据。

  明文和密文并不是由谁来读取决定的,明文也有可能是供计算机读取的数据。

× (3) 只要检查邮件发送者(From:)一栏的内容,就能够正确判断邮件是谁发出的。

  邮件的“From:”一栏很容易被伪造,因此并不能保证“From:”栏中所显示的人就是发送这封邮件的人。

○ (4) 在对称密码中,加密用的密钥和解密用的密钥是相同的。

  正确。由于加密用的密钥和解密用的密钥是相同的,因此对称密码也称为公共密钥密码。

× (5) 公开的密码算法容易遭到坏人的攻击,因此使用自己公司开发的保密的密码算法更加安全。

  不正确。密码算法的安全性不能依赖算法本身的秘密性,这一事实已经通过密码的历史得到证明了。

  不过,密码算法是公开的并不代表它一定就是安全的,这一点需要大家注意。

目录

  • 译者序
  • 前言
  • 第 1 部分 密码
  • 第 1 章 环游密码世界
  • 第 2 章 历史上的密码——写一篇别人看不懂的文章
  • 第 3 章 对称密码(共享密钥密码)——用相同的密钥进行加密和解密
  • 第 4 章 分组密码的模式——分组密码是如何迭代的
  • 第 5 章 公钥密码——用公钥加密,用私钥解密
  • 第 6 章 混合密码系统——用对称密码提高速度,用公钥密码保护会话密钥
  • 第 2 部分 认证
  • 第 7 章 单向散列函数——获取消息的“指纹”
  • 第 8 章 消息认证码——消息被正确传送了吗
  • 第 9 章 数字签名——消息到底是谁写的
  • 第 10 章 证书——为公钥加上数字签名
  • 第 3 部分 密钥、随机数与应用技术
  • 第 11 章 密钥——秘密的精华
  • 第 12 章 随机数——不可预测性的源泉
  • 第 13 章 PGP ——密码技术的完美组合
  • 第 14 章 SSL/TLS ——为了更安全的通信
  • 第 15 章 密码技术与现实社会——我们生活在不完美的安全中
  • 附录 椭圆曲线密码——密码技术综合测验
  • 附录 A 椭圆曲线密码
  • 附录 B 密码技术综合测验
  • 参考文献