随机将n个元素分配给n代理,以使每个代理只知道自己的元素
-
29-09-2020 - |
题
问题
我正在使用一个应用程序,涉及将扑克牌交给玩家。作为一个挑战,我试图以不需要可信中介的方式解决这个问题。
换句话说,任务是找到的分布式算法- 唯一分配 $ n $ 代理编号 $ 1..n $
- 允许每个代理商对分配一无所知,但它自己的
- 在揭示作业时,允许其他玩家验证赋值
我们还假设知道其他的作业是每个代理的优势,并揭示其自己过早缺点。还假设代理商能够以隐藏的所有其他代理人的方式互相交谈。
部分解决方案
我在对手不合作的假设下仅采用作用的解决方案。
这个想法是创建一组 $ n $ ann,并分配每个代理完全一个nonce。然后将该组从代理从代理商传递给代理,以在所有其他代理中隐藏的订单,直到每个代理完全接收一次。每次代理接收到集合时,它都会使用新的ONCE递交,记住新的ONCE,并确认设置到其他集合的接收。整个程序是两次完成的,此时,在所有其他代理交换所有其他代理后,所有代理都至少收到了一定程度,使得不可能识别并因此将诺斯映射到其他代理。
当最后一次代理接收到第二次,它与每个人共享,所有代理都确认其其他组件中包含在集合中。然后,基于随机种子的商定,该代理将一个数字分配给集合中的每个随机,给我们所需的唯一作业。
要允许所有权验证,而不是anncle,代理将它们的散列值放在集合上,只有在需要验证时才能显示实际的随机数。这个解决方案的问题是,如果允许对手合作,每次对手接收到集合时,它们都可以比较他们的版本,确定更改,潜在地导出哪个Nonce属于其他代理,允许他们知道有什么号码分配给他们。
所有想法都很欣赏!
解决方案
这个问题是一组名为 mental poker 的一组问题的一部分。
有由shamir的一个优秀和小文章 ,rivest和Adleman描述了如何实现这种算法的实用方法。
摘要是黄金:
可以两个潜在的不诚实的球员在不使用任何牌的情况下扮演一场公平的扑克游戏(例如,通过电话)?
本文提供以下答案:
- 否。 (提供严谨的数学证明。)
- 是的。(给出的正确和完整的协议。)
基本上,从信息理论的角度来看,没有信任的第三方,播放这样的游戏是不可能的,但是可以使用众所周知的难以反向加密功能来设计协议是可行的。
该算法将如下工作:
假设您有 $ n $ nonces(来自 $ 1 $ to $ N $ )。协议中的每个参与者都可以访问秘密函数 $ e_i $ 和 $ d_i $ ,用于加密和解密数据。此功能应满足很少的属性,我们将稍后分析。
第一个参与者被给予全套诺斯。它通过其秘密函数 $ e_1 $ 加密每个innce,随机将它们与第二个参与者传递给第二个参与者。
第二个参与者会这样做,但在这种情况下它没有annces,而是加密的诺斯的随机排列。它还将使用自己的秘密功能 $ e_2 $ 并再次加密每个元素。
然后是第三个参与者,依此类推,直到所有参与者都随着其秘密函数随身播放并加密数据。
整体设置过程是:
data = [1..n]
for i in [1..n]:
data = [e_i(nonce) for nonce in data]
shuffle(data)
.
在此设置之后,data
的每个元素都是与所有秘密函数加密的环形,以任何参与者未知的随机顺序为“数学容器”> $ e_i $ 。
请注意,每位参与者都无法在没有其他参与者的帮助下推断每个参与者。它足以让参与者完全随机洗牌数据,以便在一些恶意参与者试图偏置订单时独立地删除任何可能的偏见。
参与者 $ i $ -th被分配了on sition $ i $ 。要恢复此类Once,参与者 $ i $ 询问彼此参与者 $ j \ neq i $ 解密具有其秘密功能的值 $ d_j $ 依次。在终点参与者 $ i $ 中只有其独特加密的秘密函数 $ e_i $ 所以它可以使用 $ d_i $ 恢复它。
恢复nonce $ i $ :
nonce_i_encrypted = data[i]
for j in [1..n]:
if j == i:
continue
nonce_i_encrypted = d_j(nonce_i_encrypted)
nonce_i = d_i(nonce_i_encrypted)
.
在这个过程结束时,每个参与者都知道自己的omce,但没有其他参与者知道它的任何事情。
在使用当前问题的这个值后,通过发布秘密函数 $ e_i $ 和 $ d_i $ ,因此每个人都可以在本地所有的值计算,或者在第一步之后解密值,但在第二步之前,发布然后使用此值作为输入第二步完全解密它。
函数 $ e_i $ 和 $ d_i $ 应具有以下属性:
- $ e_i(x)$ 是message $ x $ 键下的加密版本< SPAN Class=“math-container”> $ i $ ,
- $ d_i(e_i(x))= x $ 对于所有消息 $ x $ 和键 $ i $ ,
- $ e_i(e_j(x))= e_j(e_i(x))$ 对于所有消息 $ x $ 和keys $ i $ 和 $ j $ ,
- 给定 $ x $ 和 $ e_i(x)$ 它是计算地不可能的密码分析派生 $ i $ ,适用于所有 $ x $ 和 $我$ ,<
如纸张所述,大多数本假设都是以某种方式常见的,除了属性3),它告诉加密函数必须通勤。
他们提出了一种简单的加密方案,满足这些属性。让我们说所有参与者都同意一些大型素数 $ p $ (如果在协议中修复它)。并且每个参与者秘密选择一个随机数 $ k_i $ 这样 $ gcd(k_i,p-1)= 1 $ < / span>。假设 $ q_i $ 是 $ k_i \ cdot q_i \ Equif 1 \ mod(p-1)$ < / span>。然后参与者 $ i $ 可以使用秘密功能:
$$ e_i(x)= x ^ {k_i} \ mod(p)$$ $$ d_i(y)= y ^ {q_i} \ mod(p)$$
一些关于这个算法的警告:参与者不能以这样的方式作弊,即勾结他们在学习关于其他对等方的随机性(除非<跨越类=“math-container”> $ n-1 $ < / span>参与者勾结,只有一个annce是剩下的)。然而,恶意参与者可以通过没有参与攻击议定书,有效地停止交易过程,因为每位参与者都需要许多行动,而他们正在处理诺斯。它们也可以产生痛苦,但这可以减轻扩展方案,以检测哪个参与者是罪魁祸首,并在更高的水平处惩罚这种参与者。
我在这里的代码。注意在区块链中没有任何可信的第三方,但是有一个可信计算环境,所有参与者都可以用作运行此协议的机制。