crypt.7. 如何共享秘密

来源:互联网 发布:淘宝如何刷流量 编辑:程序博客网 时间:2024/05/16 13:15

from:2017 CCF计算机课程改革导教班. 陈道蓄

17

如何共享秘密

下面的情节在“金银岛”之类的小说或电影中经常出现:有人拿到了一张藏宝图的一部分,但仅有这部分还无法确定保藏的位置,需要完整的图才行。于是他就设法去找其他部分,当然其它部分的拥有者同样渴望能找到缺失的残图,故事就此展开。

本章将讨论如何共享机密,上面的故事只不过是这个问题的一个例子而已。我们要研究如何将一张藏宝图或者其它信息分割成几部分,使得任何人在没有得到所有部分的情况下不可能还原原来的信息,就如在上面的例子中只有拿到图的所有部分才能找到宝藏。我们将看到其实把地图割成几部分并非好办法,还有其它好得多的方法。如果仔细想想,确实也很难让人信服非得拿到藏宝图的所有部分才能找到宝藏。

问题的表述很简单。假设我们打算将一个秘密S分割为若干部分,每部分由不同的人收藏,要实现的目标如下:

1. 如果大家将各自收藏的部分合在一起便可完全复原S

2. 如果合作的只是所有信息收藏者的一个真子集,他们不可能完全复原S。而且这些人从恢复的部分中很难得到关于S的有用信息。

分享机密未必只是电影或小说中的故事,它有很多重要的实际应用。设想一下,如果一个国家或者企业有及其重要的文件存放在保险箱中,只有当一个特设的委员会中所有成员均同意其公开是才能打开保险箱。要实现这个要求,可以用与委员会人数一样多的锁,委员会每位成员只保存其中一个锁的钥匙。当需要公开文件时,保险箱的锁必须全部打开,也就是人人都同意,打开各自的锁。

利用机密共享技术,我们能保证只有当全体委员同意时才可能公开文件。我们并不在保险箱上使用各自有个钥匙的多个锁,而是用一个组合锁,其组合码是保密的,可以用十进数表示。组合密码分为若干部分,分给委员会成员,每人会拿到自己的组合密码,对其他人是保密的。如果所有成员同意公开文件,他们便可将各自的密码组合在一起生成完整的组合密码,即可打开保险箱,公开文件。委员们各自的密码就像加在保险箱上不同锁的钥匙。他们就用这样的方法替代物理钥匙实现秘密共享。

除了共享保险箱的组合密码,机密共享还有许多其它应用。实际上,机密共享是密码学,信息加密,甚至更广泛的防恶意侵入或恶意篡改保密信息等相关科学中最重要的内容。假如将秘密共享与第16章中讨论的公钥密码结合起来,我们就可以用秘密信息和算法替代密钥,就像替代保险箱和锁一样。利用这样的组合方法只有所有委员会成员提供各自所掌握的部分秘密信息才能对文件解密。这里的部分秘密信息就是公钥密码系统中的公钥的组成部分。

共享机密的一种简单方法

说到现在我们还没有介绍共享机密的方法。我们该如何用委员会成员各自知道的部分秘密替代锁和钥匙呢?我们回顾一下前面讨论的文件保存在保险箱中的情况,假设我们用如下所示的50位组合密码:

  S = 65497 62526 79759 79230 86739 29671 67416 07104 96409 84628

另外假设委员会共有10人。因此密码必须分为10部分,只有10个人掌握的信息放在一起才能恢复密码S(17.1)

这显然不是什么好办法。如果9个委员同意公开文件,那他们就能恢复50位密码中的45位。我们希望即使9个委员合作,对还原

S也不该有太大帮助。可是用上述简单方法,一旦10个人中的9个意见一致,他们每人都能知道密码中的45为,而不是原来只知道5位。这有多大影响呢?如果没有合作,每个委员会想猜出密码,需要尝试1045种可能。一旦9人合作并共享了每人知道的秘密,只需要尝试105=100000种可能就可以找到密码。我们可以更具体地体会9个人合作带来的收益。假如每个人测试一个50位的密码是否有效需要1秒钟。要试出目前还不确定的5位数涉及的全部105种可能,9个人共需用3小时。1小时是3600秒,因此1小时内可以测试3600个可能的数是否能打开保险箱。显然,即使第十个人不同意,这九个人一起仍然可以在相对较短时间内确定密码,打开保险箱,公开文件。现在再看单独一个委员,他只知道密码中的5位,要试出他不知道的那45位,需要尝试所有1045种组合。仍然假设测试一个50位的数需要1秒钟,通过简单计算就可知一个委员需要大约1035年才能确定组合密码。物理学家告诉我们我们的宇宙诞生至今还没这么长时间,很有可能这个委员还没测试完,宇宙就不复存在了。

所以还是试试其它方法,以便我们能距离目标更近一些。在这个方法中,我们随机地选择10个大于0的数,它们的和等于S。这10个数就是部分密码,分别给委员会各位成员。我们来看一个小例子。这里的S是自然数,部分密码是150之间的书。为简单一些,假设委员会只有4个人,不是10个人。假设S等于129。四个部分密码分别为17473134,注意17+47+31+34=129显然如果四个人意见一致,立即可以还原密码129:只要相加即可。可是这里还是有问题:所有成员都知道部分密码在150之间。因此即使还没拿到自己那部分之前,每个人也都知道S是在4200之间。现在假如前三个委员合作,他们将已知的三个数相加得到17+47+31=95。这样他们便知道S一定在95+1=9695+50=145之间,因为第四位委员的部分密码是在150之间。那么S的值就从200种可能下降为50种可能了。这意味着三个委员合作能获取有关S的大量信息。只要加一点小小的窍门就能帮我们改进此方法,使得即使所有委员任意的真子集共享他们的信息也不会得到多少关于S秘密的信息。这个窍门采用模除。

新方法工作过程如下。假设需要在若干参与者中共享的密码是0到一个非常大的数N之间的某个数。我们前面用保险箱保存文件的例子中密码是50位,那么这个N就是1050。因为用了很大的数,我们还是假设密码由10个人共享。你一旦理解了这个方法就会知道其实不管是多少人共享都可以。整个过程分为两步:

  1 先选择0N-1之间的9个随机数t1,t2,…,t9并将他们分配给前9位参与者。

  2 按以下步骤计算分配给第十位参与者的部分密码t10:计算t1+t2+…+t9再用和除以N,不过这里用的是模除,即商被忽略,余数R是我们要的结果。接下来考虑差S-R。如果S-R是正数,则t10即为S-R。反之,如果S-R是负数,则t10S-R+N注意t1+t2+…+t10除以N的余数恰好是密码S

 

我们看一个简单例子,所用的数值不大,可以手工计算。令N=53,密码S=23,假设有四个参与者。

1 选择前三个部分密码,假设分别是17, 4731

2 确定第四个部分密码。首先计算前三个值得和:17+47+31=955395,余数为42。由于S-R=23-42是负数,因此第四个部分密码是23-42+53=34

        (  17  +  47  +  31  +  34  )  :  53  =  2  余数  23

 

17.2 采用模除运算的机密共享方法示例

你可以如图17.2所示模拟上述过程。

这个方法真能满足我们的要求吗?我们看看上面的例子。如果四个参与者合作就能算出四部分密码的和,密文S只需用N=53除和数取余便可得。例子中和为129,除以53的余数是23,正是密文S。你很容易验证这个方法不仅适用于这个例子,你换了数据照样有效。

如果不是所有参与者都一致呢?假如只是部分参与者合作,他们能确定密文S,或者获得有关S的有价值的信息吗?初看上去似乎我们给对待最后那个参与者与前面各位不一样,他的部分密码取决于前面诸位的部分密码。不过你再仔细想想就明白其实并非如此。我们再次审视一下上述例子。注意第一个部分密码17。除开17,其它几个部分密码之和为47+31+34=112。而x=17是能满足112+x除以53余数为23的唯一x值。这说明第一个部分密码与其它部分密码的关联与最后一个部分密码依赖前面所有部分密码是完全一样的。

我们仍然没有回答如果试图确定密文的合作者并非全体参与者,那会怎么样。换一个问法:确定密文是否一定要所有的参与者合作。我们还是考虑我们的例子。假定只有后三个参与者打算合作确定密文,至少也得发现一些有用的信息。这三个人掌握的部分密码是473134.。当然他们知道N=53,但不知道第一位参与者的部分密码。他们还知道所用的方法,也就是知道密文是用所有人部分密码之和除以53得到的余数。他们能算出自己的部分密码之和,112112除以53余数为6。如果第一个参与者的部分密码不是17,而是0,那原来的密文就不会是23,而是6第一位参与者的部分密码是1则密文应为7。于此类推,一直到第一个参与者的部分密码为5152,则密文则应为45准确地说,对于052之间任何数s,一定存在一个数t,满足112加上t的和除以53余数恰好是s。这就意味着,第一个参与者的部分密码t决定的密文值是052之间的某个值s,而不是23由此可知如果后三位参与者只是知道他们自己的部分密码并不能排除任何一个可能的密文值。总之,我们可以说后三位参与者合作也不可能从自己的部分密码推导出有关密文的任何信息。你很容易验证这不仅仅对我们的例子如此,一般情况下也如此。

不过你必须确保选择的数不能太小。以我们例子中的53,要想测试缺失的部分密码所有可能的值并不困难。毕竟只有53种可能。其实密文本身的值也只有53种可能,你甚至不用管部分密码,直接测试密文本身所有可能的值。因此实际应用于信息共享的数值比我们的N大得多。例如取N=1050如果这样,一个部分密码的值就有1050种可能。前面已经说过,对这么大的值试图尝试一切可能以找出部分密码是不现实的。

推广的机密共享问题

我们前面只讨论了一种情况,即所有参与者合作才能复原密件的内容。现在考虑更一般的情况:只要有足够多的部分密文就能复原整个密文。

我们从简单情况开始。假设三个参与者中任何两个人合作就可以复原整个密文。不过一个人掌握的部分密文不能复原整个密文,也不能获得有关

整个密文的有价值的信息。我们采用部分密码的和表示整个密码的方法在前面的例子中有效果,在这里恐怕没什么用了。我们需要有新的思路,几何知识可以帮我们。假设我们的机密是平面上的一个点P。三条直线是部分密文。可以将点的两个坐标值作为保险箱的组合密码。我们选择平面上相交于P的三条直线,如图17.3所示。加入三个掌握部分密文的人中任意两个合作,他们可以计算对应于各自的部分密文的两条直线的交点,也就得到了三条直线的交点P。图17.4中三个图给出了描述。

                17.3 三条交于一点的直线。交点是密文

                        17.4 平面上的机密共享

一个参与者从自己掌握的部分密文能学到什么吗?显然能学到点东西。在没拿到自己那部分信息之前他只知道机密是平面上某个点。拿到自己的部分密文后他就会知道这个点在自己的那条直线上。因此他确实能得到一些信息,但也仅此而已,他还是无法获知机密。

我们很容易将此方法推广到m个部分密文拥有者中的任意两个人合作可以复原密文。机密仍然是平面上的一个点P。但不是三条直线相交于P,我们选择m条直线相交于P,其中每条直线是一个部分密文。

如果问题改为要让任意三个部分机密拥有者能够复原密文呢?我们离开平面进入三维空间。机密仍然是一个点P,不过是三维空间的点。表示部分密文的不再是直线,而是相交于P的三个平面。图17.5所示为总共四个参与者的情况。

通过计算三个作为部分密文的平面的交点,任意三个掌握部分密文的人能复原密文。你能在图17.5(c)中看出来。不过少于三人合作也能获得一点关于密文的信息。例如两个掌握部分秘闻的参与者合作能计算出相应两个平面的交线。图17.5(b)描绘的就是掌握红色和绿色平面的参与者将他们的部分密文结合起来推导出机密一定在这两个平面的交线上,但究竟是这条线上的哪一点,他们仍然得不到任何线索。

机密共享,信息论与密码学

我们还能将机密共享问题进一步推广为是否可能由m个参与者共享机密S,其中任意t个或t个以上的人合作就能复原密件,但只要少于t个人就不可能复原密件,甚至不可能获得多少关于机密S的信息。其实对于任意的mt都是可能的,这称为mt机密共享问题。

                          17.5 空间的机密共享

一种方法就是推广上述的几何方法。当然要得到mt的机密共享方案需要用到t维空间。

甚至可能构造少于t个人即使合作也绝对不能获得任何关于S的相关信息的mt机密共享方案。这样的方案利用多项式,而不是用几何方法。它的发明者是著名的密码学者Adi Shamir,因此被称为Shamir机密共享方案。

谁来计算和分配部分密码呢?我们一直未涉及这个问题。显然这个问题很重要。不管谁来计算和分配,他就知道机密了。假如你要用机密共享方案,通常一定会假定有一个值得信赖的人,由他来计算和分配部分密码。你可以认为此人是一个绝对可信赖且绝不可能被贿赂的中间人。

如果我们说某人得到了信息,这究竟是什么意思呢?信息是什么?似乎我们都知道什么事信息。但在讨论机密共享时,我们需要数学意义上更精确的概念。如果你理解了我们上面讨论的内容,你就能精确地定义信息和信息获取这样的概念。例如,我们说部分共享不会泄露有关整体机密的任何信息,意思是指部分共享不可能降低密文的可能的值的数量。1948年著名数学家香农利用这一思想建立了数学的分支信息论。

我们还能讨论得更深入些。原则上可以获得,但实际上要花费不合理的代价才能获得的信息是没有用处的,例如那些需要用1035年才能得到的信息。机密共享问题提供了很好的例子。不论我们用什么方法在委员会的10个成员中共享保险箱1050的组合密码,理论上总是可能通过尝试全部1050中可能确定正确的组合密码。但在现实中这是不可行的。即使有计算机相助,1050这个数也太大了,不可能全部试一遍。因此,假如发现一个秘密需要的时间长到实际上不可能接受,我们就可以说这个秘密是安全的。这些考虑已经超出信息论的范围。这涉及的问题是要计算某件事,或者要获得某种信息,究竟需要多少资源。本书中你会读到对于许多有趣的问题,例如两个大数相乘(11),究竟要花多少时间才能解。另一方面,在有关公钥密码(16)或有关单向函数(14)的章节中,你会看到,某个问题无法找到有效解法,某些信息不可能或者很难获得,有时对我们也很有用处。