Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 门限方案分散算法_Python_Algorithm_Cryptography_Linear Algebra - Fatal编程技术网

Python 门限方案分散算法

Python 门限方案分散算法,python,algorithm,cryptography,linear-algebra,Python,Algorithm,Cryptography,Linear Algebra,我正在处理一个(k,n)阈值挑战,该挑战涉及将编号的密钥分配给一组n个人,这样k个人的任何子集(而不是k-1)都将拥有打开锁所需的密钥,同时使用支持方案所需的最少密钥数 我需要编写一个分散算法,它接受(k,n)并以n行矩阵的形式返回方案,每行包含一组编号的键,这些键与任何其他k-1集组合将具有所需的键集合。允许多组密钥之间存在冗余 病例为k=1和k=n: 如果k=1,则每个n必须具有所有必需的密钥,支持此方案的密钥最少为1。例如: 如果k=1,n=2,则方案为: 如果k=n则每个n必须具有不同的

我正在处理一个(k,n)阈值挑战,该挑战涉及将编号的密钥分配给一组n个人,这样k个人的任何子集(而不是k-1)都将拥有打开锁所需的密钥,同时使用支持方案所需的最少密钥数

我需要编写一个分散算法,它接受(k,n)并以n行矩阵的形式返回方案,每行包含一组编号的键,这些键与任何其他k-1集组合将具有所需的键集合。允许多组密钥之间存在冗余

病例为k=1k=n

如果k=1,则每个n必须具有所有必需的密钥,支持此方案的密钥最少为1。例如:

如果k=1,n=2,则方案为:

如果k=n则每个n必须具有不同的密钥,支持此方案的密钥最少为n。例如:

如果k=4,n=4,则方案为:

更有趣的情况是1(具有空间效率),例如:

如果k=2,n=3,则方案为:

如果k=3,n=5,则方案为:

我已经查阅了大量有关信息传播和的资料,包括拉宾的《艾达》、沙米尔的《秘密分享》等

它们的核心似乎是矩阵向量积,使用大小为(n,k)的变换矩阵乘以k元素向量(秘密)生成n元素向量(要分配的份额)

然而,我所回顾的所有实现都集中于对“秘密”或消息进行编码和解码,我正在努力将其推广到简单有效地分发编号密钥的情况

任何关于如何解决这个难题的建议都将不胜感激

n个人的每个(n-(k-1))-子集都需要自己的密钥。让我们使用Python的内置组合支持

import itertools
def scheme(n, k):
    keys = [[] for i in range(n)]
    for j, comb in enumerate(itertools.combinations(range(n), n-(k-1))):
        for i in comb:
            keys[i].append(j)
    return keys

你知道是否允许交叉发布到不同的stack exchange站点吗?因为这已经被标记了,我相信这个问题是面向编码的。哇!这似乎提供了正确的解决方案,没有我上面描述的任何复杂性
[[0], [1], [2], [3]]
[[0, 1], [0, 2], [1, 2]]
[[0, 1, 2, 3, 4, 5], [0, 1, 2, 6, 7, 8], [0, 3, 4, 6, 7, 9], [1, 3, 5, 6, 8, 9], [2, 4, 5, 7, 8, 9]]
import itertools
def scheme(n, k):
    keys = [[] for i in range(n)]
    for j, comb in enumerate(itertools.combinations(range(n), n-(k-1))):
        for i in comb:
            keys[i].append(j)
    return keys