虚者实之
首发于虚者实之
『改变未来的九大算法』: 公钥加密--用名信片来传输秘密

『改变未来的九大算法』: 公钥加密--用名信片来传输秘密

如果你想跟朋友透露一个『秘密』,你只需要在朋友耳朵边轻语就行。那么计算机 呢?它可不会『轻语』,计算机只要联上互联网,信息传播就控制不了中间流向了 ,也无法控制会有哪些计算机(路由器)知道这些信息。

本文主要探究计算机是如何解决这一问题--通过运用最精巧最具有影响力的计算 机科学思想之一:** 公钥加密* * (Public key cryptography)

试想下在现实生活中,如果你要给异地的女友寄一个写满相思语的名信片,你当然 不想让任何一个接触过这个名信片的人(比如邮局工作人员)都看到上面写满的肉 麻情话,你会在发送前将它封在一个安全的密封的信封内。这当然并不能保证多少 机密性,但比起来『赤裸裸』地寄出去的名信片,已经是进了一大步了。

那么计算机在互联网上想要进行机密通信时该怎么办呢?互联网上的所有消息都会 通过无数被称作『路由器』的计算机,消息的内容可以被任何访问路由器的人所见 ,这里当然包括潜在的恶意窃听者。也就是说,每一块离开你计算机并进入互联网 的数据,都像『赤裸裸』地写在名信片上一样!试想下在这种情况下,你把信用卡 号这样直接发给淘宝或京东网会是什么后果!

对这个问题,直观地感觉就是:为什么不对每条消息进行加密呢?当你明确地知道 要接收明信片的人时,这个方法是可以奏效的,因为你们可以事先商量好使用哪种 加密方法。这种方法的致命缺点在于当你给『不认识』的人发明信片的时候,因为 没办法事先商定好加密方法,对方是无法解密的。

计算机通信也面临同样的问题。比如,当你第一次上淘宝购物时,你的计算机必须 将你的信用卡卡号发给淘宝的服务器。但是你的计算机之前从未和淘宝服务器联系 过,两台计算机没有事先商定好加密方式。而这两台计算机之间任何尝试商定加密 方法的沟通,都会被互联网上的路由器注意到。

好像形成了一个悖论:我们要达到接收方看到的信息和邮局工作人员看到的是一样 的,但接收方却有某种办法可以解码信息,而邮局工作人员却不可能解码。

** 公钥加密 ** 为这一悖论提供了解决方案。

用共享密钥加密

我们先放弃明信片类比,用一个更简单的例子来代替:跟一间房间内的口头交流。

具体场景为:你和朋友A『白富美』以及坏蛋B『王小邪』待在一间房间里。你想要 秘密地传输一条消息给『白富美』,但又不能让『王小邪』理解这条消息。这条消 息可以是比较重要的内容,比如一张信用卡的卡号等,为了方便理解,我们假设你 要传输的只是1-9之间的某一个数字。你只能通过『大声』说话和『白富美』沟通 ,不能耍小把戏,比如传小纸条之类的。

好了,现在我们假设你要传输的数字为7.有一种办法可以让你达成目标:首先,尝 试想些『白富美』和你都知道,而『王小邪』不知道的数字,比如你们俩是发小, 从小住一起,而『王小邪』以前从不认识你们。你家的门牌号(228)就是一个很 好的『你俩都知道的数字』235.』

现在只要『白富美』用235减去你家的门牌号228,就得知了你想要对她传输的数字 『7』。而在这个过程中,尽管『王小邪』从头听到尾,但由于他不知道你们俩都 知道的门牌号, 还是不能知道你想要传输的数字到底是什么。

为什么这种方式可以奏效?因为你和『白富美』有一样东西,也就是计算机科学家 们所说的『共享密钥』:门牌号228.因为你俩都知道这个数字,但王小邪却不知道 ,你可以使用这个共享密钥秘密地传输任何数字,只要将你要传输的数字和共享密 钥相加,说出总数,让对方减去共享密钥即可。而王小邪尽管可以听到你们说的每 句话,却没有任何用处,因为它不知道要减去哪个数字。

Believe it or not.理解了这个简单的『相加trick』--将一个共享密钥和一个 要传输的私人信息相加--你就解理了互联网上绝大多数加密真正的运作原理。当 然,要真正实现保密性,还有一些细节需要注意。

首先,计算机使用的共享密钥要比房屋门牌号228长很多。如果共享密钥太短,王 小邪就可以试骗可有可能性(暴力破解)。 当你听到某种加密是一个特定位数的 数字,比如『128位加密』, 这实际上说的就是『共享密钥』的长度。共享密钥之 所以被称之为『钥』,就是因为它能用于『解锁』或『解密』一条消息。

这个简单的trick在现实生活中要想奏效还要克服一个困难:加法得出的结果能用 于统计分析,这意味着一些人能通过分析大量来自你的加密消息来得到共享密钥。 在此基础上,有了被称为『分块加密』(Block Cipher)的现代加密技术,它就使 用了相加trick的变体。

首先,长消息被分解成固定大小(通常是10~15个字母)的小『块』。 其次,和简单地将一块消息与密钥相加不同的是,每个块都会根据一系列固定规则 转换数次。这些规则类似于加法,但会让消息和密钥更紧密地混合在一起。比如, 规则可以是『将密钥的前半部分和这块消息的前半部分相加,倒置结果,再将密钥 的第二部分和这块消息的后半部分相加』,不过在现实中,这些规则要更加复杂一 些。现代分块密码基本上会进行『10轮』或更多类似操作,即操作列表会被反复应 用。在转换的轮数足够多时,原始消息会真正地混合好,并能抵御统计攻击,但任 何知道密钥的人都能用相反的步骤运行所有操作,从而获取到最初的消息。

目前最流行的分块加密是『高级加密标准(Advanced Encryption Standard)』或 称AES。AES能配合多种不同配置使用,但标准配置是使用16个字母的块,配合128 位密钥,进行10轮混合操作。

公开建立一个共享密钥

到目前为止,貌似一切都很顺利。我们知道了分块加密的基本思想,但其实我们在上面的例子里做了点弊--我们利用了你和『白富美』从小就认识,知道你家门牌号这个事实。如果你和『白富美』,『王小邪』三个人互不认识呢?怎么才能在所有沟通都必须公开的前提下,和『白富美』建立一个『王小邪』不知道的共享密钥?

猛地一看,要做到这一点好像不太可能,但有个精巧的办法解决了这个问题。计算机科学家们称这一解决方案为『Diffie-Hellman Key Exchange』,我们这里称之为『颜料混合把戏』(Paint-mixing trick)

颜料混合把戏

我们先假设你想要分享的密钥是一种特殊颜色的颜料。现在还和之前一样,你和『白富美』,『王小邪』三个人呆在一个屋子里,沟通必须公开。只是现在你们每个人都有大量不同的颜料桶,每一桶颜料都清楚地标识着其颜色。这样一来,你在指导其它人混合不的颜料就很容易了:你只要说些类似『将一桶红色颜料和三桶天蓝色颜料以及五桶粉色颜料混合在一起』的话就可以了。但是只看混合后的结果,是无法通过试错来发现混合颜色中具体加入了哪些颜色的,因为可以尝试的颜色实在是太多了。

现在我们将通过这个颜料混合的游戏来解释如何建立一个共享密钥。

这个游戏的目标就是让你和『白富美』都能制作相同的混合颜料,但不能让『王小邪』知道如何生产。

现在我们开始探访公钥加密背后巧妙思想的旅程了。我们的颜料混合把戏分为四步:

第一步: 你和『白富美』各自选择一种『私人颜色』

你的私人颜色与你最终将制造的混合颜料不同,但它将是混合颜料的成分之一。假设你选择了淡紫色为作私人颜色,白富美选择了深红色作为私人颜色。

第二步: 你选择一种新的不同颜色并公开宣布,即『公开颜色』

假设你选择了『雏菊黄』,『王小邪』自然也知道这种公开颜色,因为你是公开宣布的。

第三步: 你和『白富美』各用一桶公开颜色和一桶私人颜色制造一种混合颜色,即你自己的『公开-私人混合颜色』

很明显,『白富美』的『公开-私人混合颜色』会和你的不同,因为她的私人颜色和你不一样。

第四步: 你选取一批『白富美』的『公开-私人混合颜色』,加入一桶自己的私人颜色;
同时,『白富美』也选取一批你的『公开-私人混合颜色』,加入她自己的私人颜色。

神奇吧!你俩制作出了同样的混合颜色。

对于『王小邪』来说,尽管在你们『选取』这些『公开-私人混合颜色』的过程中,『王小邪』都全程看着,他也可以取这些『公开-私人混合颜色』,但因为他不知道你或『白富美』的私人颜色,他是无法制作出最终的混合颜色的。

你和『白富美』是将混合后的颜料进行公开展示的,而『王小邪』是没办法将混合后的颜料给『分开』,也就不不能获得其中一种私人颜色的纯正样本。

用数字进行颜料混合把戏

如果你理解了上面的颜料混合把戏,你就能理解计算机在互联网上建立共享密钥的核心机制。当然,计算机并不使用颜料,使用的是数字,要混合数字,就要运用数学。

颜料混合把戏的核心就在于要选取一种『One-way Action』:可以做一些事情,但不能取消做过的事情。颜料混合里的单向操作是『混合颜料』。将一些颜料混合起来形成一种新颜色很容易,但要分开它们并获得原来的各个颜色则不可能。

为了简单起见,我们假设『乘法』是一种『One-way Action』. 虽然你已经知道『乘法』的反而是『除法』,但在这里我们就假设『乘法』是一种单向操作,因为你们三个都没学过『除法』,不知道如何还原『乘法』得到的结果。

游戏目标还是你要和『白富美』要建立一个共享密钥,这次密钥不是颜料,而是数字。游戏规则也和原来一样,所有沟通必须公开。『王小邪』可以听到你们之间的任何对话。

好,现在将颜料混合游戏转换成数字:

第一步: 你和『白富美』各自选择一个『私人数字』

假设你选择了5, 『白富美』选择了7.

第二步: 你们其中一个人公开宣布『公开数字』

假设你选择了8作为公开数字

第三步: 将你的私人数字(5)和公开数字(8)相乘,得到『公开-私人数字』40

白富美也公开了她的公开-私人数字 7X8=56

第四步: 你把『白富美』的『公开-私人数字』(56)和你的私人数字(5)相乘,得到了共享秘密数字280

与此同时,『白富美』也将你的『公开-私人数字』和她的私人数字相乘,40 * 7 = 280

你和『白富美』都得到了共享密钥280!我们再来验证下『王小邪』不能得到共享密钥。『王小邪』听到你和『白富美』公开宣布的『公开数字』8,听到了你们的『公开-私人数字』40 和 56. 这时候如果『王小邪』知道『除法』运算,他当然可以直接用40/8=5, 56/8=7分别得到你俩的私人数字。但因为我们事先说明了,三个人都不会『除法』,『乘法』在这里是一种『单向操作』,所以他不知道如何相除。

在现实生活中,当然取的不是『乘法』这个伪装的『单向操作』,而是采用了一个被称作『钟算』(Clock Arithmetic)的数学概念。并在其中使用了『幂运算』,除了这些,基本思想跟上面介绍的游戏过程基本是一样的。

编辑于 2014-04-15

文章被以下专栏收录