上一章结论很直白:计算机自己造不出真随机,只会放磁带。那真随机从哪里来?答案分两层:经典世界里的「噪声」,和量子世界里的「本性」。这一章也把第二章卖的那个关子结了:世界到底掷不掷骰子?
经典噪声:把「测不准」榨成随机数
硬件世界充满了原则上可测、实际上测不准的微小波动。把它们放大、数字化,就是真随机数的原料:
- 热噪声:电阻里的电子被热搅得乱撞(第七章的布朗运动在电路里的样子),两端电压有微小随机起伏。Intel 从 Ivy Bridge 开始把「放大热噪声」的电路直接做进了 CPU,就是
RDRAND指令。 - 时钟抖动:两个独立振荡器的相位差永远有微小漂移,采它当随机源。
- 系统噪声杂烩:Linux 的
/dev/urandom靠「熵池」——把键盘敲击的精确时刻、鼠标移动、硬盘寻道时间、网络包到达间隔这些「测不准的小数」统统攒进一个池子,再用哈希充分搅拌。
这类随机源的本质还是第二章那句话:它是「无知」,不是「本性」——混沌放大的测量极限。理论上,拉普拉斯妖盯着你的 CPU,这些数全是可预测的。但对任何现实的攻击者,这已经够用。不过「理论上可预测」让密码学家如鲠在喉——他们想要的是物理定律担保的不可预测。
量子:世界真的掷骰子
第二章的问题在这里终审。量子力学给出的答案是:有些事件的结果,在发生之前不存在。不是我们算不出来,是宇宙中根本没有「算出来」所需的信息。
最干净的例子:让一个光子射向半透半反镜,50% 透过、50% 反射,两条路上各放一个探测器。哪个探测器响?哥本哈根诠释说:测量之前,光子处在「两条路都走」的叠加态;测量那一刻,结果才「坍缩」成一个。单次结果不可预测——不是因为镜子复杂,而是按量子力学的数学结构,单次结果没有隐藏的剧本。
「没有隐藏剧本」不是哲学口号,1964 年贝尔把它变成了可检验的不等式:如果世界底层藏着「局域的隐藏变量」(预先写好的答案),实验统计必须满足某个上限;如果量子力学对,可以突破它。从 1982 年阿斯佩实验到 2015 年三个「无漏洞」贝尔实验,结果一致:上限被突破,隐藏剧本不存在。爱因斯坦不信的那句「上帝不掷骰子」,实验站队了玻尔——而且玻尔赢得很彻底:骰子不但掷,还掷得没有任何地方写着底稿。
大白话:经典的随机是「你看不到答案」,量子的随机是「没有答案可看」。贝尔实验把两者的区别变成了实验室里能测的数。商用量子随机数发生器(QRNG)卖的就是这个:物理定律签名的不可预测性。
从噪声到比特:还得过两道加工
物理噪声到手不等于能用,还要两道工序:
- 去偏。真实噪声源总是偏的(0 比 1 多一点、电压阈值有漂移)。冯·诺依曼给过一个优雅的去偏法:把比特两两分组,01 记作 0,10 记作 1,00 和 11 丢弃——不管原始偏差多大,出来的序列严格五五开。
- 搅拌。把多个来源的噪声用密码学哈希充分混合,让任何单一路的缺陷都被稀释。Linux 熵池干的就是这个。
怎么验货:只能证伪,不能证实
买回来的随机数发生器是真随机吗?这里第一章的判词回来了:随机性无法证实,只能证伪。业界做法是拿统计检验套件(NIST STS、Dieharder)去轰:频率、连串、压缩率、自相关系数……十五项、上百项检查全过,结论也只是「没抓到毛病」。
所以工程上的信任链是分层的:量子原理保证「源头无剧本」,统计检验保证「没被抓到结构」,多源搅拌保证「单点失效不致命」。三层叠起来,就是现代密码系统的地基。
一个浪漫的收尾:既然真随机这么金贵,有人干脆把它做成了公共服务。NIST 有个「随机数灯塔」,每分钟广播一串由量子物理过程产生、带时间戳和前序哈希链的随机数,任何人可以引用;Cloudflare 则用一面墙的熔岩灯——镜头拍着一百盏灯里蜡块的翻滚——给全球相当比例的互联网流量提供加密种子。物理世界的混乱,被打包成了全互联网的公共品。
有了真随机和伪随机两味药,下一章看它们怎么干活:一种叫蒙特卡洛的方法,拿随机数当算盘,硬算那些公式算不动的东西。