几年前我有这个想法,今天我注意到了一两个洞,所以改进了它。我相信我的系统是正确的,但如果第一次有洞,这次可能会有洞。我相信下面将有一个匿名投票的选民并且不可能被篡改,除非派出票的一方给出的票数超过了应有的票数。你们有什么感想?
可以说有许多跟踪投票的政党(简称为政党)和验证您的身份并允许您投票的验证方。从软件知道您已通过验证的那一刻开始,它开始验证阶段。
连接并验证自己到验证方。选民应该收到一张票,它只是一个签名的 GUID。
各方将进行连锁联系。如果顺序是随机的,找出会话的顺序是什么
生成 X+1 公钥/私钥对,其中 X 是参与方的数量。它们应该是唯一的,并且仅用于此验证阶段。-edit-有人问为什么。如果任何链接泄漏数据,链的其他部分都无法识别它,因为它没有匹配的数据。每个步骤/链接都使用该方公钥加密。
选民将签名票和“加密数据”发送给第一方。“加密数据”是该方的公钥+内部数据,用于链中下一个链接的公钥。
每一方将检查票证是否有效/由前一方或验证方(如果它是第一方)签名。然后它将解密“加密数据”并获取它为会话保留的选民公钥。
该方将创建一个新的票证,该票证是一个新的 GUID 和剩余的“加密数据”,然后对其进行签名。它把它交给链中的下一个方。
当最后一方收到票时,它将向每一方(包括它自己)请求一张party-vote-ticket。它将有两把钥匙,一把给自己,一把给每一方。政党将每张政党投票票组合在一起,并用自己的选民公钥对其进行加密。数据被送回链上
当每一方收到加密数据时,它将使用选民提供的公钥,然后再将其发送到链上。
派对投票票只是一个签名的 GUID,正如我提到的,它是用选民公钥加密的。
投票者使用其每个私钥解密数据并解锁投票票以在下一阶段使用。
在稍后的时间(几分钟、几小时、几天),选民可以用票投票。投票步骤如下
- 使用带有 GUID 的数据块连接到任何一方
- 每一方将签署 GUID 并将其发送给下一方。
- 最后一方看到所有其他人都签署了 GUID,然后它签署然后将数据发送回链。
- 选民现在知道哪一方是最后的(即使它是随机的)并由每一方签署。选民现在可以信任该订单,因为它是签名的,并将使用最后一方的公钥加密投票票 + 选民投票给谁。选民通过链发送它。
- 最后一方解密数据,职责是向每一方发送一份副本。
一些可能的攻击
识别选民
查看 IP 地址:在两个阶段中,数据都经过各方,然后才能交换或查看任何数据。这是在投票阶段隐藏选民ip,在验证阶段解除选民ID的关联。
在验证阶段传递的数据:一方提供给下一方的信息是在每一步都不同的 GUID 和加密数据(链式加密公钥)。如果存在泄漏,则无关紧要,因为链中每个链接的加密数据都不同,因此无法将其与链中其他地方的数据相关联。
投票时间:如果一个政党通知只有 1 名选民在这一分钟登记并在这一分钟投票,则可以假设登记的人是投票的选民。最好随机化投票时间,如果许多/所有投票者在进入投票阶段之前通过验证阶段会更好。
投票篡改
- 更改投票:因为投票者在投票前有一张匿名票,所以所有投票都应该是公开的,并且投票者应该能够通过 GUID 检查每一方的投票是否正确。
- 通过重复使用已签名的票证进行重复投票:由于除了选民之外没有人可以看到票证并且没有人可以签名,这应该是不可能的。如果选民试图作弊并多次提交,请忽略它。如果选民试图投票给其他人,则将所有选票标记为“篡改”,并使用该党想要的任何其他数据记录日期/时间。
- 用不同的票重复投票:这依赖于验证方不会向一个人发出超过一张票。此外,每一方都应检查票证是否正确签名。
- 为已验证但未投票的人投票:因为每一方都使用选民的公钥加密其政党投票票,除了选民应该能够看到它。再次检查它是否已签名很重要。
- 为未经验证且不想投票的人投票:这将是验证方发放票证的问题。
- 忽略投票的政党:如果一个政党是最后一个政党并且看到它不喜欢选民投票给谁,它可能会试图通过忽略它来作弊。这再次被选民简单地检查来反驳,但选民也可以尝试使用密钥再次投票,因为它第一次被忽略了。选民应该能够在一两分钟内检查投票是否通过,即使该党决定在选举之后才知道选民投票给了谁。