是否可以使用受信任的身份验证服务器(没有客户端加密)进行投票的零知识证明?

信息安全 验证 密码学 隐私 电子签名 电子投票
2021-09-10 10:21:46

问题:

  1. 可以实现具有以下所有功能的安全投票系统吗?
    • 例如,不向政府服务器(或第三方)披露任何个人的投票,保留 ZKP 投票的所有期望标准等。
  2. 在这种系统中是否还有其他安全问题需要考虑,您将如何解决这些问题?

动机

我想要一个安全的在线投票系统

  • 依赖加密芯片(如德国身份证),这是部署的巨大障碍,因为它要求用户拥有特殊的芯片读取硬件而不仅仅是他们的身份证,也没有类似的障碍(例如大多数正常人无法使用自我管理的 PGP)
    • 它需要被普通人使用,而不仅仅是黑客或使用特殊的客户端软件。验证投票等更高级的功能可能需要特殊的软件(只要它可以由任何第三方完成,而不需要公开披露的更多信息)。
  • 可以去中心化,同时保留公开证明,证明去中心化投票中的所有参与者都是被授权对该问题进行投票的唯一人(即,无需让单方收集所有 ZKP 选票以确保没有双重投票)
  • 不会向任何人公开该人的投票,包括政府身份验证服务器和他们用来输入投票的任何第三方服务(或客户端软件)
    • 确实允许用户以不可证明的方式向第三方披露他们的偏好,例如,以便第三方可以为好的代理提供推荐

“安全”

先发制人:这里的“安全”是指“至少与当前的投票方法一样安全”,包括邮寄投票,而不是“完全不受所有可能的攻击”。但是,如果可以减轻攻击,那就太好了——例如,如果 TOTP 身份证被盗(因此其签名被撤销),最好能够在不知道它是哪一票的情况下使该投票无效。

就这个问题而言,请不要偏离诸如一般网站安全、传输安全、您是否信任政府运行这样的身份验证服务器或拥有唯一 ID、是否有人可以窃取您的 ID 卡并学习您的密码等问题等,这不是这个问题独有的。

我的重点是密码学问题:你能否拥有一个投票的 ZKP,由仅受信任的服务器进行身份验证,而不向任何中介(等)披露投票,并且不需要客户端加密(例如加密芯片 ID 或用户管理的 PGP 密钥)。

背景

认证服务器

假设有一个政府运营的服务器:

  1. 了解您的所有正式注册信息(即驾驶执照、选民登记等上的任何信息)
  2. 为您提供带有嵌入式TOTP显示屏 的实体 ID 卡(例如您的驾驶执照)
    • 服务器应该能够通过简单地标记它来撤销 TOTP,撤销是您当地 DMV 或类似机构的当面流程,说您的卡已丢失/被盗,并对其权限设置时间限制(即卡的有效期)
  3. 允许您使用您的 ID 的 TOTP + 密码对服务器进行身份验证
  4. 有一个 OpenID ish API,它允许第三方请求并且您可以选择性地授权以下信息的任何子集:

    • 标识,例如以下的任何子集:
      • 请求者唯一、人类唯一 ID(基本上,一个不可逆的散列,向第三方证明您是唯一的人类,但不能与其他站点的站点唯一 ID 相关联)
        • 想要关联用户信息的站点需要使用一个通用请求者(很像“单点登录”解决方案),或者至少是一个通用伪请求者(例如,对于单个项目的分布式投票,所有与之合作的站点都可以使用被投票为“请求者”的项目的哈希值;在这种情况下,站点可以请求一个 ID 以供自己持续使用,也可以请求一个在该问题上可共享的 ID)
      • 姓名
      • 物理地址(或其子集,例如仅县、市或州)
    • 人口统计信息,例如任何子集:
      • 性别
      • 出生日期
      • 年龄
      • 发色
      • 眼睛的颜色
      • 高度
      • 照片
    • 法律权威,例如以下的任何子集:
      • 投票背书(例如,您登记投票的司法管辖区列表、您登记的政党、以前的选举参与历史)
      • 驾驶代言(例如汽车、摩托车、卡车等)
      • 警察或政府权力认可(例如,担任警察、法官、地区检察官、总检察长等)

    所有此类响应还包括用于签名的 TOTP 卡的(特定于站点的)哈希(用于追溯使使用被盗 ID 进行的身份验证无效)。

    再次注意,您可以授权此信息的任何子集例如,如果您愿意,您只能授权披露站点唯一哈希和投票凭证,这仅向第三方提供“这是一个有权在 XYZ 区投票的唯一人”的最低限度。

  5. 有一个 API 允许第三方向政府服务器提供一个 blob(文本或二进制文件,也可能只是一个哈希),并请求您对其进行签名。

    在签署提供的 blob(将由服务器显示)时,您可以再次授权上述任何信息作为签名的一部分,以及可选的时间戳。

    签名本身可以使用任意数量的方法。

    恕我直言,最简单的是政府管理的 PGP 系统,政府拥有与给定身份证相关联的签名密钥,可以撤销该密钥,使用对您进行身份验证的政府代理的密钥签署该密钥等。

    然后,服务器将只签署(使用您的关联密钥或它自己的[如果您没有披露您的身份])元组(a)blob加上(b)您选择与该签名相关联的任何信息(在一个标准化格式)。

相信

假设该服务器被信任以提供某人的法律信息(或人类唯一性)的身份验证,以及他们对政府相关问题(例如投票权)的授权。

不一定相信此服务器知道您可能希望您的用户签署什么。例如,它可以用来签署私人合同,只给服务器一个安全的合同哈希值;然后用户签署哈希,从而签署合同,而无需向政府披露合同,也无需向第三方披露比他们想要的更多的信息。

ZKP 投票

最后,假设您想要一个基于零知识证明的投票系统,其中:

  1. 每个人都知道谁参与了投票(并且他们被授权参与)
  2. 总的来说,每个人都可以验证投票计数是否正确——或者换句话说,可以证明每个(匿名)投票来自公开参与者名单中的唯一成员
    • 这应该适用于比简单的是/否与截止日期更复杂的投票;例如,排名选择、多个选择之间的百分比分配、没有截止日期、可以更新/撤销之前的投票等。
  3. 特定选民可以验证他们自己的投票是否被正确计算
  4. 没有人可以证明哪个选民以哪种方式投票,即使有选民的合作(例如,因为选民很容易谎报哪张选票是他们的)
  5. 流动民主风格的代理人可以投票,并且可以反过来代理另一个代理人。(代理人的投票是公开的,但没有被确定,所以这只是一个附属系统;对代理人的投票可以公开追踪到对最终结果的投票。)
  6. 可以由分布式服务操作(只需要在投票的主题上进行协调并共享)

我对 ZKP 本身以外的协议建议持开放态度;我关心的只是上面的功能集,而 ZKP(由例如Helios Voting实现)是我所知道的唯一满足它们的方法。

问题是我见过的所有安全投票方法都依赖于客户端加密(客户端管理的 PGP 或加密芯片 ID),这对于普通用户来说是不可行的。我想要每个人都可以使用的东西,但仍然足够安全。

3个回答

一个零知识证明是一个“声明”,其中一方(的证据证明),可以说服另一方(验证)的声明是真实的,但没有透露任何其他信息。在 Helios Voting 中,协议使用同态加密一个简化的描述如下:

  • 每个投票都表示为 0 或 1。
  • 选民用“中央公钥”加密他的投票。
  • 通过同态加密的魔力,可以将加密投票相加:给定E(v 1 )E(v 2 )E(v 3 ) ...,可以计算出E(v 1 + v 2 + v 3 + ...),即投票总和的加密,这可以在不知道私钥的情况下完成。
  • 计算总和后,使用私钥对其进行解密。私钥分为几个部分,所有密钥持有者必须合作才能解密任何东西。如果其中至少有一个是诚实的,他将拒绝参与任何不是票数解密的解密;特别是,他将防止个人投票的任何解密。

(Helios Voting 实际上使用 ElGamal,它是乘法的同态,而不是加法,但这对于这个答案并不重要。)

此处使用 ZKP 来表明选民确实加密了 0 或 1,而不是另一个整数值。实际上,作弊用户可以尝试加密,例如,40,以便“投票 40 次”。然后,选民必须证明他的加密投票是 0 或 1,而不是其他任何东西,但不透露实际投票。换句话说,零知识证明支持客户端密码学ZKP 不是“那个”客户端加密;这是一个额外的数学,它必然发生在客户端,并且仅与客户端加密有关。这意味着如果您不想要客户端加密,ZKP 不是您的主要问题;投票加密是。


如果您不想要“客户端加密”(除了客户端系统和某些服务器之间的 SSL 隧道,即单纯的传输),那么任何必须发生的加密都必须发生在服务器上。这意味着客户端正在与之交谈的服务器必然会了解用户投票的价值。这通常被认为是投票系统的一个问题:投票系统通常需要的一个属性是,除了选民本人之外,没有任何一方应该能够知道选民的投票。

但是,如果您准备好容忍可能有一些服务器在技术上可以学习人们的投票,但不要这样做(即受信任的服务器),那么您的问题就解决了:您所需要的只是投票者有办法使用其中一台服务器进行身份验证(TOTP 将很方便),并让服务器执行所有必需的加密魔法。

如果没有受信任的服务器,也没有客户端加密,那么您将不会走得太远。如果没有受信任的服务器,您将无法容忍投票值“按原样”退出投票者的计算机;但是如果没有客户端加密,投票值不能退出投票者的计算机,除非作为连接另一端的任何人立即读取的纯值。

TOTP客户端加密,但它不能用于身份验证以外的任何其他用途。事实上,TOTP 是对某些密钥知识的证明(不是ZK证明),可由同样知道该密钥的系统验证。一次性密码的内容取决于当前时间和密钥,但不依赖于其他任何东西——特别是,不依赖于任何投票值。


一些进一步的说明:

  • 客户端加密不一定意味着客户端存储私钥对于客户端加密,您需要在客户端计算机上运行一些代码,但这并不意味着用户必须管理密钥环或类似的东西。在基于 Web 的环境中,代码通常是从服务器下载的(这就是 Javascript 的意义所在……)。

  • 事实上,基于 Internet 的系统的一个基本特性是它们是神奇的我的意思是,他们“在计算机中”做事,对大多数人来说,这是不透明的和神奇的。正如 Arthur C. Clarke 所说,计算机“超出了人们的神奇视野”。普通选民将无法验证投票的正确性。

    这就是为什么大多数选票仍然使用纸张和信封的原因。人们抓着纸。他们可以观察投票过程、清点信封、见证开封,并大致了解正在发生的事情。这就是使选举能够抵御攻击的原因:许多眼睛

    在这种情况下,在电子投票系统中可以做的最好的事情是确保如果(通过任何“受信任的服务器”)企图进行欺诈,那么它将留下至少有可能被知识渊博的专家恢复的痕迹。例如,法国基于互联网的投票(针对不住在法国的法国选民)使用签名的 Java 小程序:该小程序执行客户端加密,并且协议是这样的,只要小程序正确实现它,那么投票值无法与投票者挂钩,整个投票是安全且可验证的。但这是一个小程序:它已下载到客户端系统中,并且仍然存在于浏览器缓存中。并且它是签名的:如果小程序被刺穿,那么它仍然可以被反编译(Java 字节码不难逆向工程)并且签名将指向罪魁祸首。这意味着任何大规模的欺诈行为都可能被发现,或者至少具有相当大的风险(并且非大规模欺诈行为不会让欺诈者到任何地方)。

法语系统可能是您想要的一个很好的例子。客户端加密无需实际安装软件(小程序机制非常精简);从概念上讲,纯 Javascript 版本是可行的,但我们真的希望代码在客户端系统上留下痕迹,并带有签名,这样任何代码更改都会有风险。客户端系统上没有存储任何秘密。在投票程序结束时,选民会收到一张收据(可以打印),其中包含足够的密码信息,以允许所有不可告人的密码验证。选民身份验证使用通过邮件(纸质邮件,而非电子邮件)获得的两个自动生成的密码;如果选民拥有支持 TOTP 的设备(这是您的场景),您可以使用 TOTP。

当我阅读您的问题时,我似乎记得阅读了许多类似于应用密码学 (Bruce Schneier) 第 6 章中的投票场景。我建议你在那里寻找你的答案。

听起来您要问的一个问题是:

“TOTP 加密码是否足以提供零知识证明”?

TOTP 固有地使用服务器“密钥”进行身份验证,并且该密钥的任何隐私都暴露在服务器上。您可能需要比 TOTP 更好的东西,以及客户端更智能的硬件来完成您的需求。

听起来你也在问...

“如何部署易于使用的 2 因素身份验证,并重新使用该技术来提供零知识证明?

所有的加密都是数学。如果您正在部署执行“数学”的基础架构,并且您选择的数学是 TOTP,那么我怀疑您可以使用更好的东西来提供 ZKP。