在我们开始应用密码学之前,我想说说 什么是密码学,以及密码学应用的不同领域。 密码学的核心当然是安全的通信,它 由两部分组成。第一部分是安全密钥构造,第二是当我们 有了共享密钥后,如何进行安全通信。我们已经说过, 安全密钥构造方法是 Alice和Bob相互发送消息, 在协议结束时,他们能获得同一的 共享密钥 K。而除此之外, Alice会知道她确实是在跟Bob说话,而Bob也确定和他对话的 是Alice。而攻击者就算可以窃听他们的会话,也不知道 共享密钥是什么。这些我将在以后的课程中详细介绍。当他们 拥有了共享密钥,他们就希望能通过密钥加密,从而安全通信 我们将谈论能使他们这样做的加密方法, 并且攻击者无法得知传输的消息。 此外,如果攻击者篡改了消息,那么一定会被发现。 换句话说,这些加密方案不仅仅提供了机密性,还有 完整性。但加密还有许许多多别的用处。 我来举几个例子吧。第一个例子,那就是 所谓的 数字签名。数字签名 是 是对现实世界签名的模拟。 在现实世界,当签名文档时,你把名字签在文档上就行了。 并且,你的签名几乎始终是相同的。也就是说, 你的签名有自己的特点。而在数字世界中,这不可能 奏效,因为只要攻击者获得一个由我签过名的文档, 他就可以剪切我的签名,并粘贴到另外一些可能我并不愿意 签名的文档上。所以在数字世界中,实际上我为不同文件 的签名也是不同的。因此,我们要谈谈 如何构建安全的数字签名,这是课程后半部分的内容。 构造数字签名会非常有趣。现在我只 给你们一个提示,数字签名的工作方式基本上是通过 基于内容的签署函数来实现的。那么就算攻击者 试图将我的签名从一个文档复制到另一个上,他也不会成功 因为该签名在新文档由于内容不同, 是无法通过验证的。正如我所说, 我们将在今后的某个时间学习构造数字签名,然后再 证明这样构造是安全的。密码学的 另一个应用是 匿名通信。试想, Alice想与聊天服务器那边的Bob交谈。并且,也许她想说 诸如医疗状况这类隐私话题。她希望能匿名交谈,这样一来 服务器完全不知道她是谁。实现这个有一个标准方法,叫 mixnet,这将允许Alice一系列的代理最终与Bob交谈, 而在交谈结束后,Bob完全不清楚刚刚到底是在跟谁说话。 Mixnets 基本是这样工作的:Alice将消息发送 Bob时,消息通过了一系列代理服务器,这些消息通过适当的 加解密后,最后传给Bob时,不仅Bob不知道谁在跟他说话, 那些代理服务器甚至也不清楚Alice的通话对象是Bob, 或者说,谁都不知道对方是谁。有趣的是,匿名通信 的通道实际上是一个双向通道。换句话说, 虽然Bob不知道对方是谁,他仍然可以向对方做出回答, 而Alice也能获得这些消息。一旦我们有了匿名通信,就可以 构造其他隐私的机制了。另一个例子, 匿名数字现金 在现实世界中,如果我有实实在在的1美元, 我可以去书店,并买了一本书,而老板并不知道我是谁。 问题是我们是否可以在数字世界做同样的事情呢? 在数字世界里,假设Alice有虚拟的1美元硬币, 她想要在网上书店花掉这虚拟的1美元, 现在,我们想做同现实世界一样,那就是 当Alice用这1美元在网上书店买书时,书店也会知道她是谁。 这样,我们就提供了与现实中相同的匿名服务。 现在的问题是在数字世界里,Alice可以做一些邪恶的事情, 在她花掉这虚拟1美元之前,她可以做几份拷贝, 突然之间Alice就不止只有1美元了 她有了3个1美元硬币,并且它们是一模一样的。 没人能组织她做这样的拷贝,或者在其他网络商家 花掉这拷贝的钱。所以问题是我们如何提供匿名数字现金, 但同时,也防止Alice做刚刚我们说过的那些事? 在某种意义上,有一个悖论,那就是 匿名是与安全是冲突的。因为如果Alice有了匿名现金, 那么没人可以阻止她拷贝硬币了。而正因为 现金是匿名的,我们也没有办法找出谁做出了这种欺诈行为。 那我们如何解决呢?事实证明,完全是有办法的。 稍后我们会详述匿名数字现金。现在只是给个提示, 我们可以这么做:如果 Alice 花同一枚硬币仅仅一次, 那么没人知道她是谁;但如果她花同一个硬币超过一次, 那么突然之间,她的身份就被暴露了,然后估计就会被警察 请去公安局坐坐了。这就是匿名数字现金的工作方式。 我们将在后面的课程中尝试实现它。 另一个密码学应用是与一些抽象的协议结合的, 在我告诉你这是什么之前,先举两个例子。 第一个例子与选举系统有关。 我们有两个党,党0和党1。选民为他们心宜的党投票。 在这个例子中,选民可能支持党0,也可能支持党1。 就像这样...在这次选举中,党0得到了3票,而另一个当得到了 2票。所以,党0在此次选举中获胜。 因为一般说来得到大多数选票的党成为选举中的胜者。 现在,投票的问题如下:选民希望 知道哪个党得到了大部分选票,但与此同时并不会泄露 具体票数。那么应该怎么做呢? 为了达到这个目的,我们引进“选举中心”,它将帮助我们 计算票数,但不泄露其他信息。 参与竞选的党派将把票数通过加密送入竞选中心, 在竞选结束后,竞选中心 计算票数并宣布获胜方,而其他的所有 信息都不会泄露,也就是说单独的 票数仍然保密。选举中心当然也需要 对选民进行验证,例如选民是否有权投票,以及 是否只投了一次。但是除此之外,选举中心和 其他所有人或组织都只知道选举结果。 这是一种涉及六个对象的协议, 在这种情况下,有5个选民,1个选举中心。 他们将计算选票,而在计算结束时, 除了得知结果,其他的一切信息,诸如个人输入都未被泄露。 类似的问题也出现了私人拍卖会上。假设一个私人卖家 对自己想要的商品进行竞标。 拍卖机制使用的是“维克瑞拍卖”,即 出价最高者是这件商品竞标的获胜者,但 他只需要按第二高的出价支付。 这就是所谓的“维克瑞拍卖”。 现在我们想做的是,第一 要弄清楚出价最高者是谁,其次这个人要支付多少钱, 除此之外的其他个人竞标信息都要保密。 例如,出价最高的实际金额 应保密,唯独要公开的是第二高的出价金额, 以及出价最高的人的身份。所以在此, 我们引进“拍卖中心”,并以和选举例子类似的方法执行,即 每人将向拍卖中心发送加密的竞标书。拍卖中心将 计算的获胜者身份,以及第二高的出价, 但除了这两个值以外,其他信息仍然保密。 现在,举一个更普遍问题的例子,即 安全多方计算。那么安全多方计算到底是什么呢? 简单地说,参与者有一个秘密输入。 所以,在选举中,输入即为投票; 在拍卖会上,输入即为秘密的投标书。 参与者希望以某种函数,以他们的输入来计算结果。 在选举中,函数即为计算大多数票数,输出获胜者。 在拍卖中,该函数计算第二高的金额,以及最高者金额的编号 可他们该怎么做,才能只输出函数计算的值, 而其他信息维持保密呢? 一种比较呆板的、 不安全的方法是,我们引进一个 可信组织。然后,这个可信组织将收集所有的个人输入。 并且,它承诺对各个输入保密,也就只有它 知道那些具体输入情况。最后,它计算函数的值后公布结果。 这样一来,我们得到了结果,但 其他信息未被泄露。当然,你必须 要信任这个可信组织,如果你觉得它会搞名堂, 那就没用了。所以,密码学中有一个 让人很吃惊的中心理论:任何你想要 做的计算或者函数,如果你能把这个计算交给 可信组织做,那么你也一定可以不需要可信组织来得到结果。 让我在较高级别上解释这意味着什么。也就是说,我们做的 任何事情都可以不要可信组织插手。所以实际上参与者不需要 将输出提供给可信组织。并且,事实上,在系统中也没有 什么权威组织。那些参与者需要的仅仅只是使用某种协议与 其他参与者交换信息。而在结束后, 每个人都只知道最终结果是什么。 换句话说, 个体的输入仍然是保密的。但在此之中也没有可信权威组织 只是通过另一种方式来获得最终的输出。 这是一个普遍的结果,虽然有些难以置信,但却是可行的。 事实上,在课程快结束时,我们就会知道如何做啦! 还有一些我不能将它们归类的密码学应用, 但它们确实很神奇。 举两个例子。第一个称之为“私下外包计算”。 为了方便说明,就以谷歌搜索为例子吧。 假设Alice有一串搜索关键词想要查询, 并且有一些特殊的加密方案使得她可以将加密的查询 信息发送给谷歌。由于这种特殊加密方案的某个特性, 谷歌可以基于这些加过密的信息计算搜索,而无需知道 原始的文本是什么。也就是说,谷歌可以基于加密的信息,运 运行其大规模的搜索算法,并得到加密的结果。之后,谷歌将 发送加密的结果给Alice,Alice解密信息后得到查询的结果。 神奇的地方在于,谷歌只知道加过密的查询内容, 所以,谷歌也不知道什么Alice到底想要搜索什么, 以及Alice到底得到了什么结果。 这些就是神奇的加密方案。 它们是最近才发展的,大约从两年或三年前开始。 它使我们能够计算加密的数据,即使我们不知道 加密的内容是什么。现在,在你飘飘然之前想想如何实现。 虽然现在来说只是理论, 也许到那谷歌实现这个技术的那一天还要很久很久, 但尽管如此,这个方案可行的事实已经令人无比兴奋了, 并且,就一些相对简单的计算而言,它是非常有用的。 事实上,我们将在稍后看到一些这样的应用。另外一个神奇的 应用,是所谓的“零知识”。 我先说说“零知识证明”。 假设Alice知道一个确定的数N, 数字 N 是由两个大素数构造的。试想一下, 我们有两个素数 P 和 Q。它们很大很大,比如一千位。 我们知道两个1000位的数字想成很容易。 但如果我给你一个乘积的结果,让你把它分解为两个质数, 其实是相当困难的。事实上,我们要利用因数难分解的特点, 来构造公共密钥的密码系统,这个我们将在课程后半部分讲到 现在,Alice有此数字 N,并且她也知道的构成N的因子。 而Bob只知道数字N,他不知道构成N的因子是什么。 现在就是见证奇迹的时刻:根据“零知识证明”, Alice可以向Bob证明她知道的 N 的因子, Bob也可以做一些验证,证实Alice没有骗他, 最终,Bob却只知道N的值是什么,不知道因子P和Q的值。 这就是可证明的。Bob绝对不知道因子P和Q的值是什么。 实际上这个论证是很普遍的,一般的。 它不仅仅能证明N的因式分解,还能证明你所知道的任何难题 的答案都是你的知识。因此,如果 你解决了字谜拼图,好吧,我承认字谜这个例子不太好。 如果你解决了一个数独难题,你想证明你解决了它, 那么你可以证明给Bob看,虽然Bob不知道答案, 但却能坚信你确实知道这个数独难题的答案。 看看,密码学的这个应用神奇吧! 最后我想说,现代密码学是一个非常 严谨的科学。事实上,我们描述的每个概念都将 严格的按照三个步骤,我们将反反复复地遵循这三个步骤 所以我想要解释它们是什么。首先, 象介绍什么是数字签名那样, 我们先说说什么是威胁模型。数字签名中的威胁模型是攻击者 如何对数字签名发动攻击,以及攻击者为什么要伪造签名? 对于数字签名这个例子,我们一定要了解,签名必须是 无法伪造的。三个步骤是, 对于每一个基元,我们要描述需要 精确定义的威胁模型是什么。接着,提出一种方案。 再证明在特定威胁模型条件下,任何攻击者都能攻击这个方案 一旦攻击者成功了,那么攻击者也可以解决相对应的一些 根本的复杂的难题。如果难题够复杂攻击者无法破解, 那么也就证明了在这个威胁模型下没有攻击者能破解这个方案 以上的三个步骤实际上相当重要。就签名这个例子而言, 我们要定义数字签名意味着什么,那就是不可伪造性。 接着给出一个方案,并指出任何一个可以破解我们的方案 的人都能解决因子整数分解,而因子整数分解被普遍认为 是一个很难的问题。在今后,我们将遵循这三个步骤, 就能得到证明的结果了。这些就是本节的内容。 在下一节,我们将谈谈 密码学的历史。 End