6.3 匿名报文广播
你无法同一群密码员一起出去进餐而不引起争吵。在文献[321]中,David Chaum提出了密码员进餐问题:
三位密码员正坐在他们最喜欢的三星级餐馆准备进餐。侍者通知他们这是Maitre d’hotel安排的且需匿名支付帐单。其中一个密码员可能正在付帐,或者可能已由NSA付过了。这三位密码员都尊重彼此匿名付帐的权利,但他们要知道是不是NSA在付帐。
这三个密码员分别叫Alice、Bob和Carol,他们怎样才能确定他们之中的一个正在付帐同时又要保护付帐者的匿名呢?
Chaum接着解决了这个问题:
每个密码员在他的菜单后,在他和他右边的密码员之间抛掷一枚无偏硬币,以致只有他们两个能看到结果。然后每个密码员都大声说他能看到两枚梗币——他抛的一个和他左手邻居抛的那个——落下来是同一面还是不同的一面。如果有一个密码员付帐,他就说所看到的相反的结果。在桌子上说不同的人数为奇数表明有一个密码员在付帐;不同为偶数表明NSA在付帐(假设晚餐只付一次帐)。还有,如果一个密码员在付帐,另两个人都不能从所说的话中得知关于那个密码员付帐的任何事。
为了明白这是如何起作用的。不妨想象Alice试图弄清其他哪个密码员为晚餐付了帐(假设既不是她也不是NSA付的)。如果她看见两个不同的硬币,那么另两个密码员Bob和Carol,或者都说“相同”,或者都说“不同”(记住,密码员说“不同”的次数为奇数,表明他们中有一个付了帐)。如果都说“不同”,那么付帐者是最靠近与未看见的硬币不同的那枚硬币的密码员。但是,如果Alice看见两枚硬币是相同,那么或者Bob说“相同”而Carol说“不同”,或者Bob说“不同”而Carol说“相同”。如果未看见的硬币和她看到的两枚硬币是相同的。那个说“不同”的密码员是付帐者。如果隐藏的硬币和她看到的两枚硬币是不同的,那么说“相同”的密码员是付帐者。在所有这些情况中,Alice都需要知道Bob和Carol抛掷硬币的结果以决定是他们中的哪一位付的款。
这个协议可以推广到任意数量的密码员:他们全都坐成一圈并在他们中抛掷硬币。甚至两个密码员也能执行这个协议;当然他们知道谁付的帐,但是观看这个协议的人只知道是一个密码员付的帐还是NSA付的帐;他们不会知道是哪个密码员付的帐。
这个协议的应用远远超出了围坐在一家餐桌的范围。这是一个无条件的发方和收方不可追踪性的例子。在网络上的一群用户可以用这个协议发送匿名报文。
(1)用户把他们自己排进一个逻辑圆圈。
(2)在一定的时间间隔内,相邻的每对用户对在他们之间抛掷硬币,使用一些公正的硬币抛掷协议防止窃听者。
(3)在每次抛掷之后每个用户说“相同”或“不同”。
如果Alice希望播发一条报文,那她可以简单地对应着报文的二进制表示的1开始颠倒那些轮中的陈述。例如,如果消息是“1001”,他颠倒她的陈述,说出真情,然后再颠倒她陈述。假设她抛掷的结果是“不同”“相同”“相同”“相同”,她将说“相同”“相同”“相同”“不同”。
如果Alice发现协议的所有结果都和他们要发送的报文不匹配,那她知道其他人同时也正在试图发送一条报文。然后她停止发送报文,并再次试图发送前等待一个随机数目的轮次。虽然人们必须基于这个网络上报文通信的数量算出准确参数,但这个想法应该是清楚的。
为了让这些事更令人感兴趣,可以用其他用户的公开密钥加密。然后,当每个人都收到这个报文(这个协议的真正实现应该加上一种标准的报文开始和报文结束字符串)时,只有想要接收的人能解密并读出这份报文。其他人都不知道谁发送的它,。其他人也不知道谁能读它。虽然信息流量分析可以跟踪并搜集编辑人们通信的模式,即使这些报文本身加了密,但对此也无能为力。
代替在相邻方之间抛掷硬币的一种方法是他们保留一个随机比特的共同文件。他们也许可以把它们放在一个CD-ROM上,或者这一对中一方可以产生一堆随机比特并把它们送给另一方(当然是加密的)。另一个办法是,他们可以在他们之间商定一个保密的伪随机数产生器,并且他们每一个都能为协议产生相同的伪随机比特字符串。
这个协议的一个问题是虽然一个恶意的参与者不能读出报文,但他能通过在第(3)步中说谎来破坏系统。修改先前的协议可以检测到破坏[1578,1242];这个问题被称为“在迪斯科舞厅里吃饭的密码员”。