投票系统,这里有坑吗?

信息安全 加密 验证
2021-08-14 10:47:23

几年前我有这个想法,今天我注意到了一两个洞,所以改进了它。我相信我的系统是正确的,但如果第一次有洞,这次可能会有洞。我相信下面将有一个匿名投票的选民并且不可能被篡改,除非派出票的一方给出的票数超过了应有的票数。你们有什么感想?

可以说有许多跟踪投票的政党(简称为政党)和验证您的身份并允许您投票的验证方。从软件知道您已通过验证的那一刻开始,它开始验证阶段。

  • 连接并验证自己到验证方。选民应该收到一张票,它只是一个签名的 GUID。

  • 各方将进行连锁联系。如果顺序是随机的,找出会话的顺序是什么

  • 生成 X+1 公钥/私钥对,其中 X 是参与方的数量。它们应该是唯一的,并且仅用于此验证阶段。-edit-有人问为什么。如果任何链接泄漏数据,链的其他部分都无法识别它,因为它没有匹配的数据。每个步骤/链接都使用该方公钥加密。

  • 选民将签名票和“加密数据”发送给第一方。“加密数据”是该方的公钥+内部数据,用于链中下一个链接的公钥。

  • 每一方将检查票证是否有效/由前一方或验证方(如果它是第一方)签名。然后它将解密“加密数据”并获取它为会话保留的选民公钥。

  • 该方将创建一个新的票证,该票证是一个新的 GUID 和剩余的“加密数据”,然后对其进行签名。它把它交给链中的下一个方。

  • 当最后一方收到票时,它将向每一方(包括它自己)请求一张party-vote-ticket。它将有两把钥匙,一把给自己,一把给​​每一方。政党将每张政党投票票组合在一起,并用自己的选民公钥对其进行加密。数据被送回链上

  • 当每一方收到加密数据时,它将使用选民提供的公钥,然后再将其发送到链上。

派对投票票只是一个签名的 GUID,正如我提到的,它是用选民公钥加密的。

投票者使用其每个私钥解密数据并解锁投票票以在下一阶段使用。

在稍后的时间(几分钟、几小时、几天),选民可以用票投票。投票步骤如下

  • 使用带有 GUID 的数据块连接到任何一方
  • 每一方将签署 GUID 并将其发送给下一方。
  • 最后一方看到所有其他人都签署了 GUID,然后它签署然后将数据发送回链。
  • 选民现在知道哪一方是最后的(即使它是随机的)并由每一方签署。选民现在可以信任该订单,因为它是签名的,并将使用最后一方的公钥加密投票票 + 选民投票给谁。选民通过链发送它。
  • 最后一方解密数据,职责是向每一方发送一份副本。

一些可能的攻击

识别选民

查看 IP 地址:在两个阶段中,数据都经过各方,然后才能交换或查看任何数据。这是在投票阶段隐藏选民ip,在验证阶段解除选民ID的关联。

在验证阶段传递的数据:一方提供给下一方的信息是在每一步都不同的 GUID 和加密数据(链式加密公钥)。如果存在泄漏,则无关紧要,因为链中每个链接的加密数据都不同,因此无法将其与链中其他地方的数据相关联。

投票时间:如果一个政党通知只有 1 名选民在这一分钟登记并在这一分钟投票,则可以假设登记的人是投票的选民。最好随机化投票时间,如果许多/所有投票者在进入投票阶段之前通过验证阶段会更好。

投票篡改

  • 更改投票:因为投票者在投票前有一张匿名票,所以所有投票都应该是公开的,并且投票者应该能够通过 GUID 检查每一方的投票是否正确。
  • 通过重复使用已签名的票证进行重复投票:由于除了选民之外没有人可以看到票证并且没有人可以签名,这应该是不可能的。如果选民试图作弊并多次提交,请忽略它。如果选民试图投票给其他人,则将所有选票标记为“篡改”,并使用该党想要的任何其他数据记录日期/时间。
  • 用不同的票重复投票:这依赖于验证方不会向一个人发出超过一张票。此外,每一方都应检查票证是否正确签名。
  • 为已验证但未投票的人投票:因为每一方都使用选民的公钥加密其政党投票票,除了选民应该能够看到它。再次检查它是否已签名很重要。
  • 为未经验证且不想投票的人投票:这将是验证方发放票证的问题。
  • 忽略投票的政党:如果一个政党是最后一个政党并且看到它不喜欢选民投票给谁,它可能会试图通过忽略它来作弊。这再次被选民简单地检查来反驳,但选民也可以尝试使用密钥再次投票,因为它第一次被忽略了。选民应该能够在一两分钟内检查投票是否通过,即使该党决定在选举之后才知道选民投票给了谁。
4个回答

评论太长了,但我被要求提供详细信息。

德国宪法规定

投票设备的使用 [...] 只有在投票和计票的基本步骤能够在没有专业知识的情况下得到可靠验证的情况下才符合宪法要求

本人翻译,原文见链接)。

判决是关于简单的投票计算机,它有一系列按钮和一个显示器来显示投票以供确认。

选民不可能验证他们按下的按钮和他们在显示屏上看到的信息是否是被计算在内的信息。此外,他们无法验证没有额外的选票。政府试图争辩说,投票计算机已经过官方机构的验证并被密封以防止操纵。

法院明确表示,“专家验证”不足以满足民主选举的要求。

据我了解,您的提案有几个需要专业知识的实例:

  • 非专家如何验证密钥是否正常?(例如独特的、不可预测的、强随机性……)
  • 非专家如何验证设备是否正常?(例如,不加密/签署与用户选择不同的东西,不传输附加信息,...)
  • 非专家如何验证加密步骤是否正常?
  • 非专家如何验证签名步骤是否正常?
  • 非专家如何验证签名验证步骤是否可以?
  • ...

我认为这是显而易见的。

PS:你如何防止选民向卖家证明,他们投给了哪一方?

这个方案太复杂了,无法在这个板上评估。此外,您没有提供一些必要的关键信息(将使用它的应用程序域、所需的安全级别、威胁模型、信任谁以及为什么信任是合理的)。

因此,让我为您建议一些一般原则:

  • 关于如何使用各种加密协议构建安全、匿名的投票系统,有大量的研究文献。在尝试发明自己的方案之前,您应该先阅读以前做过的事情,并弄清楚这些方案或技术是否能满足您的需求。

  • 与其发布特定方案,我认为如果您发布要求并询问解决这些要求的最佳方法是什么,您会获得更好的运气。

  • 评估这些协议的普遍接受的标准如下:

    • 它们应该发表在同行评议的研究文献中。
    • 他们应该清楚地说明威胁模型、实现的安全属性和安全证明(证明在该威胁模型下确实实现了这些安全属性)。
    • 如果您使用的是非标准协议,那么应该清楚为什么您不使用现有的、经过审查的方案。

    安全证明的要求是一个非常重要的部分。任何人都可以构建一个他们自己看不到如何破解的复杂协议——但这并不意味着它是安全的。诀窍是建立一个其他人都无法破坏的协议……事实上,建立一个有合理基础的协议,相信没有人能够破坏它。这要困难得多,这就是密码学家通常期望并要求提供安全证明的原因。

这是非常不清楚的。

Bullets 3-4-5 - 谁在生成密钥对 - 什么被发送和加密给谁?我假设选民将“公钥”作为为该方生成的加密数据+链中的下一个链接发送给每一方。

当事人如何解密“加密数据”?你需要一个私钥来解密;似乎这仍然只有生成它的选民拥有。另外,你为什么要加密公钥?公钥不必保密。我认为您不应该为每次投票生成新的 X+1 密钥对——这似乎非常过分(密钥对生成缓慢且计算量大)——SSL 和 GPG 仅在握手开始时使用密钥对然后切换到对称的原因密码。


无论如何; 我认为你的方法的要点是你有一个收集者循环(比如 C1、C2、C3;你打电话给各方)、一个代币发行者和选民(你)。您以某种方式向令牌发行者验证您的身份(例如照片 ID、社会安全号码或其他东西),他们会发行一个 128 位令牌进行投票并将您的名字从“给定令牌”列表中标记出来。C1、C2、C3 都有私钥(只有他们知道)和所有人都知道的公钥。您为自己生成一个一次性密钥对,并签署您的令牌。你用你的签名令牌和你的公钥加密了一条给 C1 的消息,说我想尽快投票,请给我第二个令牌。他们以某种方式用 C2 和 C3 复制这些细节,然后给你第二个用你的公钥加密的令牌。

你怎么知道你的验证方是真正的验证方,而不是收集验证信息并去真正的验证方窃取你的选票的冒名顶替者?

什么会阻止各方记录额外的数据?当链条中的一个环节出现故障时会发生什么?说DDOS攻击?没有选票可以入账吗?

如果 C1 在收到你的令牌后选择从中读取 GUID,生成一个假选民密钥对并假装是你,会发生什么。也就是说,他们签署令牌,注册它并开始将其传递给下一个用户,然后用它投票。是的,您将能够看到有人以不同的方式使用您的代币投票(但如果他们以您的方式投票,则不会);但你真的无能为力。(您可以尝试重新投票;但这只会使两票无效,仍然否认您的投票能力)。

我发现这种端到端的选民可验证 (E2E) 系统协议令人着迷。但是,也许 https://crypto.stackexchange.com/ 是讨论它们的更好地方。

我认为这样一个系统的两个最困难的标准是:

  1. 选民能够向自己证明他的选择包括在最终投票总数中。
  2. 选民不能向买票人证明他确实按照买票人想要的方式投票。

实现 (2) 的最常见方式涉及实际投票地点,这使观察者可以看到没有欺凌者正在从选民的肩膀上看,以确认选民以欺凌者想要的方式投票。唉,当今大多数实体投票场所使用的协议都失败了 (1)。

虽然您的系统在 (1) 中取得了成功,这已经使它比许多投票协议更好,但在我看来它失败了 (2)。使用此协议,受恐吓的选民可以在“投票阶段”开始之前将解密的投票票 GUID 的副本发送给欺凌者,然后欺凌者可以将该 GUID 与已发布的公众投票相匹配,以查看如何选民真的投了票。然后,恶霸可以奖励那些按照恶霸想要的方式投票的选民,并惩罚任何拒绝交出解密后的投票票 GUID 的选民。(或者我错过了这个协议的一个关键特性?)