1 个不稳定版本
0.1.0 | 2019 年 8 月 12 日 |
---|
#1143 in 密码学
42 星 & 12 关注者
130KB
3K SLoC
🗳️ ElectionGuard 验证器
此存储库包含选举加密记录验证器的参考实现。选举结束后,验证器可以运行以检查已发布的计票是否与所有加密选票的计票相符,而无需解密任何选票。它是通过验证各种 零知识证明 来建立加密选举数据的完整性的。
验证器检查以下关于加密选举记录的属性,其总和足以确保该记录与生成已发布最终计票的选举的正确表示相符。通过零知识证明建立的属性被强调。
- 对于 整个选举,我们检查
- 可以一起解密选举的受托人数量大于零
- 解密选举所需的受托人阈值大于零
- 解密选举所需的受托人阈值不大于受托人总数
- 选举的加密参数(素模数和群生成器)是有效的
- 选举参数的哈希值已正确计算
- "扩展基哈希"已正确计算
- 联合公钥已正确计算
- 对于 选举受托人,我们检查
- 受托人公钥的数量等于受托人的数量
- 每个受托人公钥都具有实现选举参数中指定的阈值解密所需的正确数量的系数
- 每个受托人拥有与他们发布的公钥相对应的私钥
- 对于每个已投选票,我们检查
- 竞争的数量等于选举中指定的竞争数量
- 每个竞争可能选择的数量等于选举中指定的可能选择数量
- 对于每个竞争,选民选择的数量不超过该竞争的总允许选择数量
- 对于每个竞争,任何给定选择对应一个或零票(即没有使用数字技巧来制造“计数两次”的选票)
- 对于每个废票,我们检查
- 竞争的数量等于选举中指定的竞争数量
- 每个竞争可能选择的数量等于选举中指定的可能选择数量
- 加密的选票解密后与随附的明文选票相同
- 一系列其他有效性和良好形态检查[待扩展]
- 对于发布的最终计票结果,我们检查
- 我们从单个选票计算出的加密总和与选举记录中发布的加密总和相匹配
- 发布的加密总和是对发布的明文选举结果的加密
本实现的作用
本实现旨在作为验证器的参考实现——它旨在简单、易懂、正确。虽然我们希望它高效且可扩展,但这些关注点是其参考作用之次。因此,本代码库中难以理解或未充分记录的部分应被视为错误——如果发现它们,请在问题跟踪器中报告。
构建和运行
这是一个Rust项目,可以使用标准的Rust工具链进行构建。由于代码关键部分中存在大量大整数算术,为了获得良好的性能,需要在发布模式下构建
$ cargo build --release
本crate包含两个可执行文件:verify
和encrypt
。前者是上述描述的工具,可以像下面这样运行
$ cargo run --release --bin verify -- -i $PATH_TO_ELECTION_RECORD.json
如果没有通过-i
(或等效的--input
)提供路径,验证器将期望从stdin读取记录。
encrypt
工具主要用于测试用例生成。它只是读取stdin上的未加密选举记录文件,并将加密的选举记录文件输出到stdout,使用随机生成的受托人密钥进行加密。例如
$ cat $UNENCRYPTED_RECORD.json | cargo run --release --bin encrypt > $ENCRYPTED_RECORD.json
tests/
目录包含使用此工具生成的各种文件。目前,它们是
invalid_randomized.json
:所有数据的随机生成数字,应使每个检查失败invalid_three_different_broken_proofs
:一个有效的选举加密,除了三个被单个数字更改的任意证明外valid_encrypted.json
:一个有效的选举加密unencrypted.json
:一个小型未加密选举记录样本,演示了encrypt
工具预期的模式,并适合生成上述类似的测试用例
贡献
帮助捍卫民主并为项目贡献力量。
依赖关系
~4.5–6MB
~101K SLoC