问题描述
我对以下问题的解决方案感兴趣:
有一些秘密信息 一群 n 的人愿意 锁定,直到最小数量 1< = m < = n 他们同意发布它。例如,比如所有人的名字 该小组的参与者。
我们如何加密这些信息 并将 n '键'分发给它 信息仍然是私密的 永远,除非至少在某个时刻 m 提交密钥以解锁信息?
约束
对于任何 k < m (甚至 m-1 ),至关重要的是成功概率极低仅使用 k 键检索信息。同样重要的是,对于任何 k > = m ,成功的概率应该非常高。
最佳(但不一定),我想要一个具有以下属性的解决方案:
最初,我认为一个好的解决方案可能只涉及加密信息并分割出(私人)密钥,但我无法找到分割密钥的好方法。
特别是,当 m 和 n 变得非常大时,问题似乎变得更加困难,因为有和没有> = m之间的界限愿意小组成员变得越来越瘦(可以这么说)。
如果你知道一个解决方案,那么正确方向的推动将比完整答案更可取。
答案 0 :(得分:7)
要进行密钥拆分,请查找Shamir's Secret Sharing。这是一种经典的方法(1979年出版)。
答案 1 :(得分:0)
您可以使用基于XOR的分割,以下是它的工作原理:
您提供所需的件数 - n和密钥 - K.要生成n个密钥,您需要创建(n - 1)个随机数:R1,R2,R3,.... 。 。 ,Rn-1。为此,您可以使用SecureRandom数字生成器,这将防止我们重复。然后您在这些Rn-1件上操作XOR功能和您的密钥 - K:
Rn =R1⊕R2⊕R3⊕。 。 。 ⊕Rn-1⊕K
现在你有n件:R1,R2,R3,......,Rn-1,Rn,你可以销毁K.这些件可以在你的代码中传播或发送给用户。
为了重新组装钥匙,我们在Rn件上使用XOR操作:
K =R1⊕R2⊕R3⊕。 。 。 ⊕Rn-1⊕Rn
使用XOR函数(⊕),每个部分在重建密钥时都具有固有的重要性,如果任何部分中的任何位被更改,则密钥不可恢复。
有关更多信息,您可以查看我为此目的编写的Android实用程序:
GitHub项目:https://github.com/aivarsda/Secret-Key-Split-Util
此外,您可以尝试使用该实用程序的Secret Key Splitter演示应用程序:
GooglePlay:https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter