密码学科普小说 · 第 6 章

陌生人也能握手:Diffie–Hellman

1976 年,美国斯坦福。一个夏夜,校园里蝉鸣阵阵。两个人正坐在台阶上激烈讨论,旁边地上散落着几张写满公式的纸。

年长一点、留着一头长发的那位叫惠特菲尔德·迪菲(Whitfield Diffie),年轻一点的叫马丁·赫尔曼(Martin Hellman)。Alice 和 Bob 假装是来问路的,凑过去听了一耳朵,就再也走不动了。

他们在解决的,正是温先生在酒馆里问的那个问题:两个人从没见过面,所有对话都会被偷听,他们还能不能商量出一个只有他们俩知道的秘密?

Alice 忍不住插嘴:“可是……所有话都被偷听了,怎么可能还有秘密?”

迪菲笑着从包里掏出几管水彩颜料(他们本来是打算画海报的):“小姑娘,我们来玩个游戏。”

混颜料:公开的黄色 + 各自的秘密颜色 公共色:黄 Alice 秘密:红 Bob 秘密:蓝 黄+红=橙 黄+蓝=绿 公开交换(偷听者也看得见) 两人各自再混入自己的秘密色 → 同一种棕色
颜料比喻:混色容易,把混好的颜色再“拆”回去几乎不可能。

游戏是这样的:

第一步,大家公开约定一种颜色,比如黄色。偷听者也知道。

第二步,Alice 偷偷选一种只有自己知道的颜色,比如红色;Bob 偷偷选蓝色。

第三步,Alice 把黄和红混成橙色,公开递给 Bob;Bob 把黄和蓝混成绿色,公开递给 Alice。偷听者看见了橙色和绿色。

第四步,Alice 在收到的绿色里,再加一份自己的红色;Bob 在收到的橙色里,再加一份自己的蓝色。

两人手里得到了完全一样的棕色——都是“黄 + 红 + 蓝”。

Bob:“而偷听者手里只有黄、橙、绿。他要得到棕色,就得从橙色里把红色‘拆’出来,或者从绿色里把蓝色‘拆’出来。混颜料容易,拆颜料……”

赫尔曼:“……在数学上非常难。当然,真实的版本用的不是颜料,而是大数的模幂运算:把一个公开的数 g 自乘 a 次,再对一个大素数 p 取余数。正着算很快,可从结果反推 a——这叫‘离散对数问题’——在数够大的时候,现在全世界的计算机加起来也算不动。”

📌 课堂小结:Diffie–Hellman 密钥交换(数学版)

公开:大素数 p,底数 g。
Alice 秘密选 a,公开发送 A = ga mod p;Bob 秘密选 b,公开发送 B = gb mod p。
Alice 算 Ba mod p,Bob 算 Ab mod p,两者都等于 gab mod p——这就是共享密钥。
偷听者知道 p、g、A、B,但要算出 gab,通常得先解离散对数,这在参数足够大时是不可行的。
⚠️ 注意:原始 DH 本身不能防冒充(中间人可以分别和两边各握一次手),所以实际中要配合数字签名或证书使用。

Alice 呆住了:“所以……那个死循环,就这么被打破了?不需要先有一条安全的路?”

迪菲:“不需要。我们还在论文里提出了一个更大胆的设想:每个人可以有一对钥匙,一把公开,一把私藏。用公开的那把加密,只有私藏的那把能解;用私藏的那把签名,所有人都能用公开的那把验证。我们管它叫‘公钥密码’。只是……我们还没找到一个真正好用的数学构造。”

Alice 想起自己在磨坊里说的“挂锁”,脸一下子红了。

Bob 则在心里默默倒数:一年以后,麻省理工的三个年轻人会在一个逾越节的晚上,喝着酒,把这个设想变成现实。

📌 思考题

1. 用颜料比喻向家里人解释:为什么两个人当着所有人的面说话,还能商量出一个秘密?
2. 如果有人站在 Alice 和 Bob 中间,分别冒充对方和他们交换颜色,会发生什么?要怎么防?