主题:如何分摊秘密(一)——从《鹿鼎记》中的四十二章经说起 -- 明日枯荷包
先考虑简单的,两个人之间如何分摊秘密。比如那个两个人分摊六位数密码的事情。这俩人是甲和乙。
现在拿一个能均匀地随机地产生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
- 相关回复 上下关系8