除非在没有受信任的第三方的情况下一致同意,否则我如何才能使是/否投票的结果无法访问?

信息安全 第三者 电子投票
2021-08-10 01:36:45

一个有 N 人的家庭(其中 N >= 3)是邪教的成员。他们匿名提出了一个离开邪教的建议。事实上,如果每个人都暗地里有离开的欲望,最好让家人知道,这样他们就可以敞开心扉,计划好他们的离开。不过,如果不是这样,那家人就不想知道实际结果,以防内讧和猎巫。

因此,是否有某种方案,如果家庭中的每个人都投票赞成,家庭知道,但所有其他结果(全部否,否的任何组合)对于所有家庭成员来说彼此无法区分?

一些注意事项:

  • N 必须至少为 3 - N=1 是微不足道的,而 N=2 是不可能的,因为赞成的选民可以根据结果知道其他人的投票。
  • 匿名的建议者并不重要——很可能是家庭以外的人,比如散布宣传的人。
  • 重要的是,所有否定都与混合肯定否定没有区别——我们不希望家人发现存在某种分裂。但是,如果该结果是不可能的,我可以接受任何一致的结果都可以发现,但任何混合投票都无法区分的结果。

我已经尝试过的一些事情:

  • 当然,这可以通过一个受信任的第三方来完成——他们都告诉一个人他们的投票,第三方宣布是否所有的投票都是yes然而,这对我来说并不是很令人满意,因为第三方可能会被一个狂热的反对者(或其他邪教成员)妥协,确定谁赞成票。另外,这个人知道选票,在混合投票的情况下,可能会私下会见赞成票的人,帮助他们逃跑,反对票的人不会善意的。
  • 可以使用第二个第三方匿名化选票 - 一方(实际上可能只是一顶摇过的帽子)收集选票而不读取它们并将它们匿名发送给第二方,后者读取它们并宣布结果。这是我能想到的最好的解决方案,但是我仍然认为我想做得比这更好——毕竟,在一个居住的定居点邪教中,你可能找不到任何值得信赖的第三方。我想找到一个使用不一定受信任的第三方的解决方案。
  • 但是,我确实承认您至少需要一些东西来保存秘密信息,因为如果您使用的是完全公开的分类账,那么参与者可以在提交他们的实际信息之前制作信息的秘密副本并模拟他们的投票会产生什么影响投票。特别是,如果所有参与者都投了赞成票,但最后一个人还没有投赞成票,他们可以模拟一个赞成票,并发现其他人都投了赞成票,然后他们自己投反对票——他们现在独自知道其他人的赞成票,这是你不希望剩下的没有选民拥有的权力。

编辑:在 BlueRaja 发表评论后,我意识到“受信任的第三方”的概念并没有得到很好的定义,而且在某种程度上,我实际上可能确实需要一个受信任的第三方,至少可以可靠地保持状态。关键是我会信任第三方做什么——例如,在第一个和第二个要点示例中,我可能不相信第三方知道谁投了什么,但可以相信他们的投票内容。当然,理想情况下,我仍然希望能够在没有受信任的第三方的情况下进行操作,但如果做不到这一点,我想尽量减少我必须信任第三方才能做的事情。(另外,是的,第三方可以包括无生命的物体或机器,只要它可以隐瞒参与者的任何信息量)。

4个回答

理论

这可以通过应用幂等性原则以多种方式实现。

您想要一个仅在所有输入都处于活动状态时才产生结果(二进制 1)的系统,也就是说,它告诉您只有在每个人都投了赞成票时,每个人都想离开邪教,否则系统不能返回任何类型的信息(二进制 0)。这基本上是输入之间的 AND 关系,如下表所示(0 = 否/假,1 = 是/真):

Input: You want to leave the cult.
Output: Everybody wants to leave the cult.

0 0 0 | 0 
0 0 1 | 0
0 1 0 | 0
0 1 1 | 0
1 0 0 | 0
1 0 1 | 0
1 1 0 | 0
1 1 1 | 1 ---> hooray, everybody wants to leave, we can talk about it!

现在,要安全地实现这可能并非易事,因为您需要可以计数的东西(N-1 不足以触发结果,但 N 会),并且能够计数的东西也可能会泄漏信息关于票数。因此,让我们忘记这一点,并意识到,由于您实际上是在处理单个信息(是或否,0 或 1),那么如果您只检查相反的内容(否而不是是),您将能够获得有价值的信息, 0 而不是 1 等)。所以如果你检查他们是否想留在邪教而不是离开,如果你检查是否至少有一个人想留下而不是检查他们是否都想离开,你会得到下面的真值表,其中所有的 1 都被替换了0s,反之亦然:

Input: You want to stay in the cult.
Output: Somebody wants to stay.

1 1 1 | 1
1 1 0 | 1
1 0 1 | 1
1 0 0 | 1
0 1 1 | 1
0 1 0 | 1
0 0 1 | 1
0 0 0 | 0 ---> hooray, nobody wants to stay, we can talk about it!

请注意,现在我们在输入之间建立了 OR 关系,我认为这更容易安全地实现,因为您只需要一个以完全相同的方式响应任何输入的系统。这样的系统将是幂等的:一个投票足以触发输出,任何后续投票都将无效。现在,我们可以用什么来实现这样的系统?该系统将需要以下功能:

  • 它必须得到每个人的信任。它不能由一个家庭成员或其他人建造或购买。所以我想它一定是非常简单的,每个人都能理解和信任。为避免对系统的恶意操纵,还应在所有成员的监督下进行操作。
  • 在实验结束之前,选民必须无法检查输出。这意味着投票不得返回有关系统当前状态的任何反馈。例如,如果您能看到蜡烛、感觉到热量或闻到任何东西,吹蜡烛是不安全的。

系统

我能想到的最简单的解决方案是涉及带有幂等按钮的电子设备,例如用于更改电视频道的遥控器。这是我如何设置系统的示例:

  • 获取具有幂等按钮的设备。它可能是一台带遥控器的电视,只要切换到频道 N 总是具有相同的效果,无论您执行多少次(幂等性)。或者您在家中拥有的任何其他东西,例如打开门的按钮(如果打开打开的门使其保持打开状态)等。但重要的是系统需要得到每个人的信任,所以如果您真的想这样做一切安全 家庭可能会考虑购买新设备(一起去商场,购买受信任的设备)。
  • 安全地设置系统。在设置系统时,所有家庭都必须在场,否则系统可能会被设置系统的人破坏。一般来说,全家人都必须在场,并检查从实验开始到结束的所有操作(比如从购买设备到安全丢弃)。
  • 投票时避免来自系统的任何反馈。例如,要更改电视频道,电视和遥控器可能会被盖在厚厚的毯子下,而要投票,您需要将手滑到毯子下。但是应该把音量调到静音,也许你最好在背景中打开一些音乐,声音足够大,以至于听不到电视发出的任何嗡嗡声或噪音。您甚至可能想要在一个投票和下一个投票之间定义一些延迟,以避免从前一个投票者的手引起的遥控器可能产生的热量中获得任何反馈。
  • 每个人的投票过程都应该相同。在实验过程中,其他成员必须确保选民没有作弊(比如在毯子下偷窥、表现得很奇怪等),所以每个人都在实验过程中。选民应该能够将手放在毯子下的时间相对固定。将其滑到毯子下并立即将其拉出被认为是无效的,因为那将是明显且可公开区分的否决票。从外面看,每张选票看起来都差不多。
  • 在将系统用于实际实验之前对其进行测试您需要确保每个人都了解流程,正确投票,并且系统做出相应响应。全家人参加了几次模拟投票来测试系统(模拟投票是假的,公开的,不是秘密的)。
  • 最后,必须安全地拆除系统。任何被触摸的按钮或部件都可能需要仔细清洁,以去除指纹。如果家庭成员在投票后不信任系统,担心有人可能从中提取信息,则可能需要丢弃系统的所有部分。

投票

假设他们选择实施电视遥控毯系统,会发生什么。“大家好,电视开着,现在的频道是123,如果你想留在邪教,换成0频道”。每个成员依次将一只手滑到毯子下,或者改变频道(如果他们想留在邪教中),或者假装改变频道(如果他们想离开)。最后,毯子被移开,然后…… 123 频道!那么没有人愿意留在邪教中,万岁!...或...频道 0!那么至少有一名成员想要留在邪教中!或者也许所有这些,没有办法知道。

最后的笔记

想办法解决这个问题很有趣,但我认为这更像是一个思想实验,而不是一个真正的安全问题。问题是威胁模型不完整,因为我认为这种情况在所有成员都是邪教的家庭中实际上没有意义。根据定义,邪教成员被洗脑和偏执。他们甚至可能不相信商店会购买新电视或遥控器,认为任何人他们还不知道(包括任何卖家)可能是“敌人”。绝对有可能在没有任何电子设备的情况下建立一个系统,只使用蜡烛、罐子、水、绳索等简单的物体。与黑盒电子设备相比,这些东西可能更容易信任,但它也可能使此类系统可靠运行变得更加困难。我也想知道:如果家庭成员建议需要投票,那不是很可疑吗?为什么一个邪教成员要知道家里的每个人都想离开吗?提出这个系统的人很可能是想离开的人。或者这可能都是找出谁想离开的陷阱。

这听起来像是密码安全多方计算的经典案例。

使用 SMPC 实现的功能将是一个 AND 树缩减,它需要 N-1AND 门,并且具有大约log_2(N)AND 门的深度,每个“是”投票都是对电路的真 (1) 输入,每个“否”都是假(0) 输入。

最简单的解决方案可能是使用 GMW SMPC 协议,该协议允许 N-1 方一起工作而不会泄露任何秘密信息。还有一个变体允许最多 N/2 人偏离协议。

协议的基本流程如下:

  1. 每一方都有一个 1 位输入,并选择 N-1 个随机位并计算随机位与输入位的 XOR。然后将一个随机位分配给另一方,所有者保持随机位和输入的异或。
  2. 然后逐个门评估电路,让每个人都获得该门输出值的异或随机份额。通过简单地对输入值的份额进行异或运算,可以在本地计算异或门。与门需要一个交互式协议,这有点复杂,因此我将向您推荐(格式化的)论文: Goldreich、Micali 和 Wigderson 的“如何玩任何心理游戏”(STOCS'87;PDF)。
  3. 最后(在评估完所有门之后)每个人都广播他们在输出位中所占的份额,以便每个人都可以在本地对它们进行异或运算。

总体而言,上述 GMW 协议将需要N * (N-1)/2来自每一方的 4 次中的 1 次不经意转移,对于任何规模合理的“家庭”来说,这应该是可以有效计算的,甚至可能不需要像 OT 扩展这样的花哨技术来处理这么少的参与者。

至于软件,MP-SPDZ似乎是寻找实现的一个很好的起点(以及awesome-mpc 列表)。尽管请注意,您通常会在那里找到更高级的方案。

一种技术含量很低的方法:给每个选民一张卡片,卡片的一端打了一个洞,偏离中心。制作一个装有卡片的容器,并在其上打一个孔,如果正面朝上进入,则与卡片上的孔对齐。每个人都通过将卡片正面朝上放入容器进行投票,正面朝下表示反对(将盒子适当隐藏以防止任何人看到自己的选票)。然后将一根杆插入容器中的孔。如果每个人都投赞成票,那根棍子就会掉下来。如果至少有一个人投了反对票,则该杆将被停止。

盒子里有一只猫,里面装着一瓶毒气。小瓶被装配到一个按钮(标记为“否”)上,该按钮将释放气体。在该按钮旁边,还有一个虚拟按钮,它发出相同的点击声(标记为“是”)。盒子是隔音的,你看不到里面。一家人坐在前面。按钮在后面。每个人轮流走到盒子后面并按下一个按钮。当每个人都轮到时,猫——进而延伸到邪教——处于叠加状态。通过打开盒子来折叠它——或者,为了获得更好的效果:戴上防毒面具,然后打开盒子。最后,酌情将猫埋葬或解散邪教。在后一种情况下,使用二次投票程序来决定谁养猫。