【问题标题】:Threshold scheme dispersal algorithm阈值方案分散算法
【发布时间】:2017-02-06 17:05:11
【问题描述】:

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

我需要编写一个分散算法,它采用 (k, n) 并将方案作为 n 行矩阵返回,每一行包含一组编号的键,与任何其他 k-1 组结合将具有所需的键的集合。允许跨集合的密钥冗余。

"trivial" 的情况是 k = 1k = 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 DispersalSecret Sharing 上查看了大量资料,包括 Rabin 的 IDA、Shamir 的秘密分享等。

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

但是,我审查过的所有实现都侧重于实际编码和解码“秘密”或消息,我正在努力将其推广到简单有效地分配编号键的情况......

非常感谢任何关于如何解决这个难题的建议!

【问题讨论】:

  • 你知道是否允许交叉发布到不同的堆栈交换站点?
  • 由于这已被标记为python,我相信这个问题是面向编码的。

标签: python algorithm cryptography linear-algebra


【解决方案1】:

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

【讨论】:

  • 哇!这似乎提供了正确的解决方案,而没有我上面描述的任何复杂性。 :)
猜你喜欢
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2012-08-02
  • 2019-10-04
相关资源
最近更新 更多