西西河

主题:如何分摊秘密(一)——从《鹿鼎记》中的四十二章经说起 -- 明日枯荷包

共:💬63 🌺987 新:
分页树展主题 · 全看首页 上页
/ 5
下页 末页
    • 家园 如何分摊秘密(四)——两个人的秘密

      先考虑简单的,两个人之间如何分摊秘密。比如那个两个人分摊六位数密码的事情。这俩人是甲和乙。

      现在拿一个能均匀地随机地产生0到9之间的数字的随机产生器。

      一个好的骰子可以算一个“能均匀地随机地产生1到6之间的数字的随机产生器”。骰子有六面,分别标着1到6的数字,因为是“好的”,掷一次,掷到每个数字的可能性都是一样的,都是1/6。如果那个骰子是灌铅用来出老千的,掷出6的可能性比较大,那就不算好骰子。如果把掷出来的数字减1,它也就是一个“能均匀地随机地产生0到5之间的数字的随机产生器”。要均匀地随机地产生0到9之间的数字,也有办法。现在的计算机程序也能产生一些叫“伪随机数”的数字序列。这些都是技术问题,具体该怎么得到这样的随机数和本文无关,所以就不多说了。反正我们假设现在有这样一个机器,每次我们问它它就随机给一个0到9之间的数字,每个数字出现的可能性都是1/10。

      现在老板就让随机产生器产生六个0-9之间的数字,比如735049。把这个数字给甲,这是他掌握的秘密。

      然后老板用密码(真正的秘密)123456去逐位减735049。怎么个减法?

      1-7 = -6 --> 4

      2-3 = -1 --> 9

      3-5 = -2 --> 8

      4-0 = 4 --> 4

      5-4= 1 --> 1

      6-9 = -3 --> 7

      我们注意到每个结果如果是负的,就加个10让它变成正的,仍在0-9之间的数字。于是老板得到498417,把这个数字给乙,这是他掌握的秘密。

      我们看看甲和乙都掌握和知道什么秘密。

      甲拿到735049这个数,可是这个数字根本就是老板拿随机产生器产生出来的,跟密码123456没有一点关系,他拿到这个数字,不会增加一点点对密码本身的知识。甲知道了735049这个数字以后,对他来说,所有000000-999999之间这1000000万种可能的密码的范围没有一点改变,每个都有1/1000000的可能是真正的密码。关于这点,他没拿到735049以前就知道了。

      乙拿到498417,他会对真正的密码是什么增多点了解吗?不会。真正的密码当然有可能是123456,如果甲的数字是735049的话;但是真正的密码也有可能是999999,如果甲的数字是501581的话。甲的数字可能是000000-999999之间这1000000万种,而且每种都有1/1000000的可能会是甲手里的数字;而每个可能是甲手里的数字,都对应着一个最终的密码。最后乙能推断出来的结论还是:最终的密码是000000-999999之间这1000000万种可能,每个都有1/1000000的可能是真正的密码。可是关于这点,他没拿到498417以前就知道了。

      但是一旦甲和乙一起决定要取款了,他们就可以把他们掌握的两个数字逐位加起来:

      7+4 = 11 -->1

      3+9 = 12 -->2

      5+8 = 13 -->3

      0+4 = 4 -->4

      4+1 = 5 -->5

      9+7 = 16 -->6

      和减法时差不多,如果结果大于9,就减一个10让它变成仍在0-9之间的数字。我们就得到了密码123456。

      总结一下上面我们做到了什么:首先我们用一个6位随机数把密码123456拆成了让甲和乙分摊的两部分。当他们都决定要知道账号密码时,他们掌握的这两部分秘密可以很方便地推断出账号密码(要算几个加减法,但比吭哧吭哧地拼地图碎片方便多了);其次也是更重要的一点是,甲或乙无法单独地通过自己新掌握的秘密来得到以前不知道的信息。这正是我们希望得到的效果。

      我们是怎么证明,甲或乙在获得他们分摊的那部分秘密时,没有增加任何他们以前不知道的信息的?是通过说明,对他们来说,原本账户密码有1000000万种可能,每种的可能性都是1/1000000,而等他们拿到分摊的秘密后,他们知道的还是这样。这跟被告诉了账号密码的前三位或后三位大不一样。

      注意到那个随机数产生器必须是“好的”,产生出0-9之间每个数字的可能性都要一样。否则的话,比方说它产生7的可能比产生3的要大,而这点被乙知道了。那么当乙拿到他那部分秘密时,看到比如第一个数字是4,那么真正的账号密码的第一位是7+4=11->1的可能性就要比是3+4=7的可能要大,这样,对于乙来说,1000000万种可能中,每种的可能性不再都是1/1000000,而是有多有少,这样乙就获得了他以前不知道的关于账号密码的信息。同样,如果随机数产生器产生出来的每一位数不是独立的,比方说如果先出来个一个3,后面那位就更容易出来一个5,这样的信息也会让乙推断出他以前不知道的关于账号密码的信息。所以随机数产生器的质量是非常要紧的。

      喝水ing

      通宝推:明心灵竹,铁手,
    • 家园 如何分摊秘密(三)——分摊秘密不容易(2)

      再举个例子。

      比方一个老板有两个手下,叫他们去某地拿某账号付一下某笔款项,而这个账号有个六位数密码。这个密码显然不能完整地告诉给两个人中的某个人,否则这个人可能独自偷偷拿了款潜逃。那么比如这个密码是123456,我告诉第一个人头三位123,第二个人后三位456,到时候付款的时候两人把这密码一拼就可以付款了。

      这当然可以,但是显然密码的保险性降低了。本来如果我根本不知道密码,那么所有的可能性是10^6,也就是10的6次方1000000种。现在我知道了前三位123,那么密码的可能性就只有后三位的变化了,只剩1000种。虽说也不少,但总没有原来的1000000种保险。

      况且这个方法不好推广。要是觉得两个人太容易合谋,就派6个人去,每人记一位密码,如果里面5个人合谋,那他们就只要猜剩下那个人的数字是多少,最多猜十次就猜到了。

      这个方法的不利之处前面就讲过了:在这种分摊方法下,每个人都掌握了点秘密,而且每个人都的确知道一点秘密。注意这里“掌握”和“知道”的区别。掌握是说,这部分秘密你要是不泄露,别人无法知道,由你决定在某场合是不是要把你的这部分秘密和其他人的部分秘密合起来得到整个秘密。你要是真到付款的时候也不愿意说密码,那款也没法付。八旗某旗主就是不愿挖宝,就不拿出他那份地图碎片来,别人也没辙一定要叫他拿出来。这是“掌握”,但不一定是“知道”。比如某个八旗旗主虽然有一堆地图碎片,但是光凭这些碎片,他对宝藏在哪里一点头绪都不知道,特别是不比其他没有碎片的人知道得更多。

      这点要展开来讲讲。所谓“知道”某个“秘密”,并不一定要确确实实地知道这个秘密是什么。比如说,如果你知道那个秘密不是什么,而别人不知道这点,对这个秘密,你就知道得比别人多了。举个例子,香港有八卦杂志,说明星的八卦事,什么艳照啦集邮啦,大家就猜,这谁啊。好,过一阵说那是L某某,其实你还是不知道其实是谁,连姓啥都不知道是刘还是梁呢,但是你已经知道的比原来多啦。如果杂志要是说“大眼睛”,那就更搞不清了,多大的眼睛算是大眼睛?但是我们知道,是曾志伟的可能性比较小,梁朝伟?可能比前面这个大点但也不太象。我们可以看到,就算我们得到的只是可能性的变化的信息,就可以说我们“知道”了更多的秘密。

      "密码的前三位是123"这样的分摊的方法,不但让分摊人掌握了整个秘密的一部分,而且还让原本密码的1000000种可能性,减少到了1000种,这就泄露了整体秘密的一部分,让掌握秘密的人知道了比不掌握秘密的人知道的要更多的信息。地图碎片其实也是同一个道理,一个人掌握的碎片其实还是泄露了整幅地图的一部分信息,而同谋人数多起来时,这种信息的泄露就越来越严重。如果地图不被割碎,只是一个旗主一块,这种泄露秘密的现象就更严重了。

      放在我们面前的任务是:让每个人都掌握一部分秘密(这是“分摊”要求的),但是被掌握的这部分信息却不会对掌握秘密者泄露任何被分摊的秘密的信息,也就是说,我们希望掌握秘密的每个个体对秘密的了解程度,不比不掌握秘密的人对秘密的知道程度更高。更进一步,即使有同谋,几个同谋把自己掌握的信息合起来后,也无法提高对秘密的知道程度。也就是说应该这样:八旗中的七个旗主如果都把自己掌握的地图碎片拿出,他们也无法取得哪怕一丁点他们以前不了解的秘密,只有第八个旗主也参与进来,那时候他们才会完整地了解整个秘密。

      这好像很矛盾的样子,要求“掌握”却要求一点都不“知道”。但是这是可能做到的。

      土鳖又要喝水,才能抗铁牛

      元宝推荐:铁手, 通宝推:明心灵竹,

      本帖一共被 1 帖 引用 (帖内工具实现)
    • 家园 等不及了

      偷偷地溜去看了 wikipedia 上 secret sharing 的条目,呵呵,发现还有一个 Chinese Remainder Theorem,不过智商太低,实在看不懂,只能灰溜溜回来搬个板凳听讲解

    • 家园 如何分摊秘密(二)——分摊秘密不容易(1)

      前面说到,有一些秘密需要这样被分摊:多个个体中任何一个个体都不单独掌握秘密,但是在所有个体一起决定要揭开秘密时,他们就能够知道完整的秘密。

      据说可口可乐的秘密配方也是这么保密的,被拆成了三份,每个人都不知道其他两人的那部分配方。不过我觉得这好像有点问题,可口可乐配方毕竟不像宝藏,大家说挖出来吧,把秘密完整合起来就行了,然后这个秘密就作废了。可口可乐很长时间都会生产。在此就这么一说吧。

      有时候电影里有租银行保险箱的情节,保险箱上两个钥匙孔,一把钥匙在银行工作人员那里,另一把则在客户手里,而保险箱要两把钥匙一起开才打得开。这也是一种类似的分摊秘密的方法,分摊的是打开保险箱的权力。

      回到《鹿鼎记》的宝藏上,我得说金庸在设计藏宝图这个情节时是有一番考虑的。

      比如说,按照陶红英所说,“将收藏财物的秘密所在,绘成地图,由八旗旗主各执一幅”,那么也可以理解成每个旗主都有一幅完整地图。但是这样就有问题了。也许会有某个旗主不告诉其他人,自己偷偷去把财宝掘出。所以这种“多个人里每人都独自地完整地掌握”秘密的方法是不好的,不能满足旗主会议的要求。

      如果是绘一张地图,但不割成碎片,只割成面积相同的八块,然后八个旗主一人一块会怎么样呢?稍微想想的话,这也不合适。如果那地图是象动画片里的海盗藏宝图那样,画了宝藏周围地形,然后在藏宝处画个叉号,那么割开的八块小地图上,显然带叉的那块信息量比较大。地图割开以后虽说不完整了,但是还是有可能从局部的特征,比如海岸线的形状啦,山脉的走向啦,猜测到所绘的区域。就算分到的地图小块上没有藏宝处的叉,如果猜出了地图所绘的区域,那么就可以推知宝藏也离此不远。打叉的那块就更占便宜了,要是猜出了局部区域,那就跟拿到完整地图没啥区别。

      如果说地图上还有文字说明,那也许更糟。比如宝藏给埋在鹿鼎山了,要是你拿的的那块地图上有鹿鼎两字,那泄露的消息也就够多了。碰上象《基督山伯爵》里法利亚长老那种能把烧掉一半的纸上的文字中缺少的部分猜出来的强人,你撕半张纸给他和把整张纸全给他是一样的,那这就谈不上“分摊秘密”了不是?

      所以金庸就设想了先把地图剪成小碎片,再把碎片分成八份的方法。如果剪得足够碎,那么每小片上的地图的局部特征就不明显,加上各人拿到的碎片都是随机的,光凭八分之一的碎片数量就很难拼出较大的局部来。这不失为一种好方法。但是如果只有两个人来分摊秘密怎么办?那时候凭一个人手上的碎片,拼出较大的局部部分还是比较有可能的,而且这个时候拼出来的部分分布在原来的整个地图上,不再聚集在一个角落里,通过观察不完整的地图来得出整幅地图的一些信息也就更有可能。

      这种情况在有多个但不是所有人都是同谋的时候更明显。比如八旗中的六个旗主说,另外两个不愿挖宝,但我们六个愿意。结果六个旗主拿了6/8=3/4数量的碎片来拼,就能拼出一幅虽然到处是破洞,但是很可能看得清的地图来。这就违背八旗会议的原意了。虽然说这也可能是个优点,万一八旗中有一旗旗主不小心把他那一份地图搞丢了,剩下七旗也还有比较大的可能可以挖宝,不至于因为不小心丢失一份地图碎片,整个秘密就永远无法揭晓了。

      这就提出了一个新问题:怎么样在若干人之中分摊秘密,使得只要在规定人数以上(而不一定是所有人)同意揭开秘密的时候,秘密就可以被揭开,而如果同意的人数低于这个数目,秘密还是无法揭晓?比如八旗会议可以规定,只要有任何六个旗主决定挖宝,他们就可以拼出一幅完整的而不是满是破洞的地图来,但是如果只有五个旗主同意,他们就一定无法拼出地图来,甚至只是多知道一些信息也不行。小说中切成碎片的方法显然不行:六个旗主拼出来的地图会有很多洞,不能保证一定能找到宝藏;五个旗主拼出来的地图要比六个的更破烂一些,但是未必就一定找不到宝藏。

      继续喝水……

      • 家园 居然得宝了!

        乐坏我了

        恭喜:你意外获得【通宝】一枚

        鲜花已成功送出,消耗 铢钱 1 个,可能得宝。可通过工具取消

        提示:此次送花为【有效送花赞扬,加乐善、声望、帖得花总数】。

      • 家园 记得当年学组合数学的时候

        记得当年学组合数学的时候,有一道习题

        有一扇门,要求n个人有权限开,但是必须保证这n个人中有任意大于等于m个人在场时才能开,任意小于m个人在场时都不能打开门。问门上要挂几把不同的锁,每把锁要配几把钥匙,每个人拿几把锁的钥匙。

        当时会做来着,容我想想

        • 家园 想出来了

          现在要发个帖子还真不容易,因为没有通宝,还要现攒通宝才能发帖。

          想出问题答案耗时2分钟,攒通宝耗时20分钟。。。无语。。。

          回到刚才的问题,假设现在凑齐了m-1个人,他们打不开门,必定是缺至少一把锁的钥匙,而剩下的n-m+1个人只要到一个,就可以补上这把钥匙,所以一把锁要有n-m+1把钥匙。

          还是假设现在凑齐了m-1个人,他们至少是打不开一把锁。这种组合一共是c(m-1,n),而且每种不同的组合不可能是打不开的是同一把锁,所以锁的数量是C(m-1,n)把。

          而锁的数量x每把锁配的钥匙=每个人有的不同锁的钥匙数量x人数(n),所以每个人带几把钥匙也能算出来了。

          最后再抱怨一下,新人回个帖子也这么难,还得现攒通宝。

          话说前苏联作家抱怨:他们在八十年代出版一部小说,可以挣一部小轿车。同样的作家在九十年代出版一部小说,得先把自己的小轿车卖掉。。。

          现在西西河也收版面费了。。。

          唉,什么世道。。。


          本帖一共被 1 帖 引用 (帖内工具实现)
          • 家园 要我就n人每人一把钥匙, 把锁设计成加法逻辑锁

            比如一个电路的加法逻辑开关或每个人打开一个水流开关的, 相加总流量推动大门之类的. 按你的算法, n个人有钥匙, 来2个人开: 要n-1把锁,每个人要n-2把钥匙.一共,(n-1) x (n-2)把钥匙.

            • 家园 呵呵,这是组合数学课的习题,不是实际问题

              习题是为了巩固所学知识的,不是为了解决实际问题的,也不是脑筋急转弯。所以习题里的假定和规定的解题方法,必须遵守,才能达到练习的目的。

              就好像计算机课的机习题,要求编2^N点fft的程序,你不能告诉老师matlab里都有,使用起来也更方便快捷,所以用matlab一算就行了。

              • 家园 问题是你的算法有漏洞, 你算的是m个人绝对能通过的分配法

                你的算法先假设了m-1人一定不能通过, m个人一定能开的前提, 但你得到结果后,忘了验算结果是否符合你的前提. 5个人掌匙, 3个人开. 10把锁, 30把钥匙, 每人6把. 为什么两个人12把钥匙一定不能开? 为什么不能1个是{1,2,3,4,5,6} 另一个是 {5,6,7,8,9,10}. 验算一下就知道你算的只是m个人一定能开的排列法.

                • 家园 这种分配法

                  能够使某两人开锁通过,但不能使任选两人都能开锁通过。

                  前面的题目上不仅有M个人可以通过,还有任一M人选都可通过的限制。

                • 家园 应该是至少要有C(m-1,n)个锁和n-m+1把钥匙

                  multiple证明的是, 为了保证任意m个人在场时能开门, 而任意m-1个人都不能开门, 那么至少需要C(m-1,n)个锁, 每个锁至少需要n-m+1把钥匙.

                  接下来可以证明, C(m-1,n)和n-m+1作为下界是可以达到的. 即存在一种钥匙分配方式, n个人中的每一个都分配C(m-1,n-1)把钥匙, 使得任意m个人在场时能开门, 而任意m-1个人都不能开门. 注意C(m-1,n)*(n-m+1) = C(m-1,n-1)*n = C(m,n)*m.

                  这个证明应该不难, 但也不直观. 具体到n=5,m=3的情况时, 可给出以下的分配方案: {1,2,3,4,5,6}, {4,5,6,7,8,9}, {1,2,4,7,8,10}, {2,3,5,8,9,10}, {1,3,6,7,9,10}. 不难验证, 此方案可以保证任意3个人能开门, 而任意2个人不能开门.

                  关于存在性的一般证明, 我想任意m-1个人应该恰好拥有n-m+1把共同钥匙, 同时他们的合集应该恰好缺少1把钥匙.

分页树展主题 · 全看首页 上页
/ 5
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河