密码学有个不太好意思说出口的秘密:所有精巧的数学——椭圆曲线、大数分解、格——最后都挂在一个朴素的东西上:一个谁也猜不着的随机数。算法是公开的,流程是公开的,整个系统的全部秘密都浓缩在密钥里(这叫柯克霍夫原则:保密靠密钥,不靠算法)。而密钥的全部强度,就是产生它那个随机数发生器的强度。随机数猜得着,数学再漂亮也是纸糊的。
这一章看三件事:随机性在密码学里能达到的理论极限、它一旦掺水会发生什么、以及工程上怎么伺候好它。
理论极限:一次一密,香农盖过章的「绝对安全」
想象最笨的加密:明文每个字母,和密钥里对应字母「相加」(模 26),密钥是一串真随机字母。香农 1949 年证明了一个惊人的定理:只要密钥(1)真随机、(2)和明文一样长、(3)只用一次、(4)不泄露,那么截获的密文不包含明文的任何信息——不是「很难破」,是数学上「无可破」:任何一段同样长度的明文都能配出某个密钥产生这段密文,破译者面对无限多等可能的解,连「猜对了」都无法确认。这叫一次一密——大白话讲,用真随机噪声把明文完全淹没,密文里除了噪声什么都不剩。
完美保密的代价全在「密钥管理」上:密钥要用真随机(第九章的物理源)、要和明文一样长、见一次面就得换新的、还得安全地送到对方手里。这四条少一条,天就塌了。苏联在 1940 年代的间谍网里把「只用一次」破成了「偶尔重用」——美国的维诺纳计划抓住重用的密钥对密文做差分,噪声相消,明文浮出,一点一点抠出了几千页苏联密电。一次一密仍是「绝对安全」的,前提是那个随机真的「只随机一次」。
大白话:一次一密是密码学的光速——理论上碰不得的完美,实践上伺候不起的娇贵。它真正的遗产是那个证明:足够的真随机,可以让信息彻底消失。
掺水的随机:三起真实事故
现实系统不用一次一密,用 AES、RSA 这些实用算法——但密钥、随机数填充、临时数,样样要从随机数发生器里出。发生器一掺水,算法直接架空。三起教科书级事故:
- 1995 年,网景浏览器:SSL 密钥的种子是「当前时间 + 进程号」。加州大学两个学生(Ian Goldberg 和 David Wagner)一算:时间能猜、进程号范围小,整个密钥空间几分钟就能穷举完。「安全浏览器」的锁,钥匙孔比钥匙大。
- 2008 年,Debian 的 OpenSSL:一位开发者为了消除编译器警告,删掉了一行「往随机池里搅入未初始化内存」的代码——连带把真正搅入熵的那行也废了。此后近两年里,Debian 系系统产生的所有密钥,种子只剩进程号:32767 种可能。全球几万台服务器的「随机密钥」,其实每人只有三万分之一的秘密。
- 2010 年,索尼 PS3:签名算法 ECDSA 要求每次签名用一个全新随机数(叫临时数)。索尼把它写死成了一个固定值。两个签名一相减,私钥直接解出来——和维诺纳是同一个错误:噪声被「重用」之后就不再是噪声。黑客当众演示算出索尼的根密钥,整个主机防线清零。
三起事故同一个模式:没有人破解数学,他们只是不再猜随机数——因为随机数已经不值得猜了。
工程答案:CSPRNG 与它的红线
于是有了密码学专用的随机数发生器(CSPRNG)——大白话讲,就是第八章的「磁带机」加固版:内部状态用密码学原语搅拌,让「观察到输出」反推不出状态、「预测下一个数」在计算上不可行。但红线依然是第八章那条:梅森旋转统计再好也不许进密码学——它的输出能反推状态。CSPRNG 的标准是更狠的一条:不但看起来乱,连「知道全部过去的输出」都不许对「下一个比特」给出任何优势。
还有一层阴影值得一提:2013 年斯诺登文件披露,美国 NSA 推动成为 NIST 标准的随机数发生器 Dual_EC_DRBG 被指留有后门——特定常数让知道秘密参数的人能从输出反推状态。这提醒了最后一课:随机数发生器的「随机」,你不光要它乱,还要知道它为什么乱、谁挑的参数。这也是第九章熔岩灯和量子灯塔存在的意义——把「信任」尽量换成「可审计的物理」。
从武器回到生活
密码学把随机性的地位推到了顶点:足够的真随机能让信息消失,掺水的随机能让堡垒自塌。到此为止,本书讲了随机的定义(第一章)、来源(二、九)、统计脾气(三到七)、人造与使用(八到十一)。
最后一章回到我们自己。离开了赌场和机房,随机性还统治着一件事:人生。运气和本事怎么分?成功故事里有多少是噪声?在一个随机的世界里,怎样做决定才算聪明?