3.5 多密钥公开密钥密码学

    公开密钥密码使用两个密钥,用一个密钥加密的报文能用另一个密钥解密。通常一个密钥是私有的,而另一个是公开的。让我们假设Alice有一个密钥,Bob有另一个,那么Alice能够加密报文,并且只有Bob能把它解密; 反过来Bob能够加密报文,只有Alice能读它。

    Colin Boyd推广了这个概念[217]。设想一种具有三个密钥KA,KB,KC的公开密钥密码的变体。表3.2给出了它的分配。

表3.2  三个密钥密钥分配

Alice

KA

Bob

KB

Carol

KC

Dave

KA和KB

Ellen

KB和KC

Frank

KA和KC

    Alice可以用KA加密报文以便Ellen用KB和KC解密此报文。这样Bob和Carol可能冲突。Bob能对报文加密以便Frank能读它,Carol也能加密报文以便Dave能读它。Dave能用KA加密报文以便Ellen能读它,由于有KA , Frank也能读它,或者Dave同时用KA和KB加密以便Carol能读它。类似地,Ellen能够加密报文以便Alice和Dave或者Frank能读它。表3.3归纳了所有可能的组合,再也没有其它组合。

表3.3  三个密钥的报文加密

用作加密的密钥

必须用的解密密钥

KA

KB和KC

KB

KA和KC

KC

KA和KB

KA和KB

KC

KA和KC

KB

KB和KC

KA

    这可以推广到n个密钥,如果密钥的某个子集用来加密报文,那么就需要用其它密钥来解密此报文。

广播报文

    假设有100个工人在野外作业,你想给他们当中的一些人发送报文,但预先并不知道是该向哪些人发。可以为每个人单独加密报文或者为每种可能的组合都给出密钥。第一种选择需要增加很多通信量;第二种选择需要更多密钥。

    采用多密钥密码方案就容易得多,我们将用三个工人:Alice、Bob和Carol。。将KA和KB给Alice,将KB和KC给Bob,将KC和KA给Carol。现在可以同想要通信的任何子集交谈。如果想发送一报文只有Alice能读它,就用KC加密此报文。当Alice接收到此报文时,她先用KA,然后再用KB解密。如果想发送一报文只有Bob能读它,就用KA加密;用KB加密时,只有Carol才能读它。如果发送一报文使Alice和Bob都能读它,就用KA和KC对它加密,等等。

    这可能不会有什么激动人心的地方,但对于100个工人来说,它就非常管用了。单独的报文表示和每个工人共享一个密钥(总共100个密钥)和每个报文。每个可能子集的密钥表示共有2100-2个不同的密钥(针对全部工人的报文和不对工人的报文除外)。这里的方案只需要一个加密报文和100个不同的密钥,这个方案的缺陷是你不得不广播哪个工人的子集能够读报文,否则,每个工人将不得不试所有可能的密钥组合,以寻找正确的一组密钥,甚至只要意向接收者的名字也行得通。至少,要想实现简单,每个人实际上得到大量的密钥数据。

    有其它用于报文广播的技术,其中有一些避免了前面的问题,这些将在22.7节中讨论。