【发布时间】:2017-02-06 17:05:11
【问题描述】:
我正在处理一个 (k, n) 阈值挑战,该挑战涉及将编号的密钥分配给一组 n 个人,这样 k 个人(但不是 k-1)的任何子集都将拥有开锁所需的钥匙,同时使用支持该方案所需的最少钥匙。
我需要编写一个分散算法,它采用 (k, n) 并将方案作为 n 行矩阵返回,每一行包含一组编号的键,与任何其他 k-1 组结合将具有所需的键的集合。允许跨集合的密钥冗余。
"trivial" 的情况是 k = 1 和 k = n:
如果 k = 1 则每个 n 必须具有所有必需的键,支持此方案的最少键数为 1。例如:
如果 k = 1 且 n = 2,则方案为:
[[0], [0]]
如果 k = n 则每个 n 必须有一个不同的密钥,支持此方案的最少密钥数是 n。例如:
如果 k = 4 且 n = 4,则方案为:
[[0], [1], [2], [3]]
比较有趣的案例是1 (有空间效率),例如:
如果 k = 2 且 n = 3,则方案为:
[[0, 1], [0, 2], [1, 2]]
如果 k = 3 且 n = 5,则方案为:
[[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]]
我在 Information Dispersal 和 Secret Sharing 上查看了大量资料,包括 Rabin 的 IDA、Shamir 的秘密分享等。
这些的核心似乎是矩阵向量乘积,使用大小为 (n,k) 的变换矩阵乘以 k 元素向量(秘密)产生 n 元素向量(要分配的份额)。
但是,我审查过的所有实现都侧重于实际编码和解码“秘密”或消息,我正在努力将其推广到简单有效地分配编号键的情况......
非常感谢任何关于如何解决这个难题的建议!
【问题讨论】:
-
你知道是否允许交叉发布到不同的堆栈交换站点?
-
由于这已被标记为python,我相信这个问题是面向编码的。
标签: python algorithm cryptography linear-algebra