在网上看到一篇讲门限密码的blog,讲挺好的,但个人感觉有一些细节部分缺失,自己再补充一些。
链接
(如何有条件的话,动手画个图会帮助自己理清思路。)
背景
大家都看过谍战片,传递消息的时候为了防止线人叛变,往往会将消息切分成多部分进行传递,即使有个别内鬼,也无法解析出消息的含义。当然,这样的坏处也是显而易见的,如果内鬼叛变,自己人也无法或者消息的内容。
基于此,门限密码也应运而生了,其目的在于保证只有收到m个消息及以上接收方才能正确的计算出消息。
换句话说,老大发出n个消息,只有m个以上特工叛变,敌方才能得到的秘密;同理,只要有m个以上的特工顺利到达,消息就能够被顺利的解析。
这样的问题就被称做(m,n)门限。
解决方案
有了这个idea,如何实现它呢?
首先,我们有n个特工,门限为m,则存在如下约束:
- 约束1:只要收到m个以上的消息就能解析出加密数据。
- 约束2:收到不足m个消息则不能解析出加密数据。
那么,我们有以下几个待求解问题:
- 一个完整的数据应该切成几片?
- 每个数据片应该分给几个特工?
从简单的开始,假定所有特工携带相同数目的数据块且不能有两个不同的数据分块由相同的特工们投递。
根据约束1,每个数据片只需要放在n-m+1个特工上即可实现。
(此时有m-1个特工没有数据片,此时无论m怎么取,总能获得一个带有数据片的特工。
满足了约束1、下一步我们将尝试用上述规则满足约束2。
对于n个特工,n-m+1个碎片,总共有C(n-m+1,n)种分配方法。
我们暂时假定,分配方法的数量就表示着完整数据的切片数量。
- 首先证明C(n-m+1,n)符合约束2:
因为C(n-m+1,n)覆盖了所有的排列组合方式,所以对于m-1及以下,总存在一个秘钥分片是m-1个特工所没有的。(例如存在分块k,其分配方式是第m号特工携带,1~m-1不携带,此时不违反约束1.
故约束2满足。 - 随后证明数据块数目不能大于C(n-m+1,n):
很显然,如果切片数量大于C(n-m+1,n),则系统必会出现两个不同的数据块,以同样的方式被n个特工携带,失去了数据分片的意义。
以下图门限(5,3)为例子,倘若数据块数量大于20时必然存在数据块的分配方式与之前20块相同。
(如图所示,第21块数据块的携带方式与第1块相同)
携带数据块
特工
1 2 3 21
1 1 1 1 1
2 1 1 0 1
3 1 0 1 1
4 0 1 1 0
5 0 0 0..... 0
- 最后,尝试证明不能小于C(n-m+1,n):
缺少的那个数据分片B的携带方式将成为一个bug。假设B规定1~m-1号特工不携带数据,则选取1到m-1这m-1个特工即可覆盖所有的数据块。与约束二矛盾。
(道理也不复杂,因为只有B这个数据块是m-1个特工都不具有的。
(约束1规定某一个数据块最多只有m-1个特工不携带。
至此,我们就完美解决了(m,n)门限的问题了.做法是只需要把密钥分成C(m-1,n)份,每份拥有n-m+1份拷贝。
实现
有了以上基础,下一步的问题就是如何切分秘钥呢?
空间几何
这是一个十分美的解决办法.还是先从个上面的(3,5)门限的例子来说把,只要把密钥编码成空间中的一个点,每个特工手上拿着一个平面方程.所有特工所持有的平面方程全部都交于一个点.因为只有三个或以上的平面才能交于一个点,所以,只要有三个特工到达,拿出他们手里的平面方程一解,答案就是密钥.用这种解决办法,对于(m,n)门限,只要把空间的维数相应的改变成m就可以了。
中国剩余定理
todo