5个版本 (3个重大更改)
0.8.0 | 2023年1月13日 |
---|---|
0.7.1 | 2020年8月23日 |
0.7.0 | 2020年6月21日 |
0.6.0 | 2019年5月7日 |
0.1.0 | 2019年3月17日 |
#440 in 密码学
27KB
277 行
Benaloh Challenge
实现了Benaloh Challenge(也称为交互式设备挑战),这是一种密码学技术,用于确保不可信设备的诚实性。虽然最初是在使用电子设备进行投票的背景下提出的,但它对于所有不可信的计算都很有用,除了使用RNG之外的计算。大多数密码学都属于这一类别。
有关该协议的更多详细信息,请在此处查看
- 通过选民发起的投票站审计确保选票投放的保证 by Josh Benaloh,2007 [pdf]
- 基于分布式账本技术的端到端可验证数字投票协议:Proof of Vote by Becker等人,2018 - 第3.2.7节 [pdf]
示例
use benaloh_challenge;
use rand::Rng;
use sha2::Sha256;
use rsa::padding::PaddingScheme;
use rsa::{PublicKey, RSAPrivateKey, RSAPublicKey};
// Untrusted computation that is deterministic with the exception of an RNG
// For this example we encrypt a vote for an election using RSA.
fn untrusted_computation<R: Rng>(rng: &mut R, key: &RSAPublicKey, message: &[u8]) -> Vec<u8> {
let ciphertext = key.encrypt(rng, PaddingScheme::PKCS1v15, message).unwrap();
return ciphertext;
};
let mut rng = rand::thread_rng();
let mut hasher = Sha256::new();
let public_key = RSAPrivateKey::new(&mut rng, 512).unwrap().to_public_key();
let vote = b"Barak Obama";
let mut challenge = benaloh_challenge::Challenge::new(&mut rng, |rng: _| {
untrusted_computation(rng, &public_key, vote)
});
// Get the commitment
let commitment = challenge.commit(&mut hasher);
// Reveal the secret random factors used in the encryption. This also invalidates the results.
let revealed = challenge.challenge();
// Check the commitment on a different (trusted) device.
benaloh_challenge::check_commitment(&mut hasher, &commitment, &revealed, |rng: _| {
untrusted_computation(rng, &public_key, vote)
})?;
// In a real voting application, the user would be given the choice to change their vote here.
// Get another commitment
challenge.commit(&mut hasher);
// We could challenge here again if we wanted
// but instead we get the results, discarding the random factors.
let ciphertext = challenge.into_results();
协议描述
此协议发生在用户、可信设备和不可信设备之间。在此示例中,用户将是Alice,可信设备将是她的手机,不可信设备将是投票机。投票机需要使用RNG(加密Alice的选票)进行一些不可信的计算,其细节需要保密,以便Alice不能向第三方证明她如何投票。然而,投票机需要向Alice保证它已正确加密选票且未更改她的选票,同时不让她知道它在加密中使用的秘密随机因素。
-
Alice在投票机上标记她的选票。
-
当Alice完成时,投票机使用RNG的随机因素加密她的标记选票,并向Alice展示加密选票的单一哈希值(例如,通过QR码)。这个单一哈希值被称为承诺。投票机向Alice提供两个选项:她可以选择“投票”或“挑战”。
-
如果Alice选择“投票”,则投票机将加密的选票写入磁盘,过程结束。
-
如果Alice希望“挑战”,她将使用手机扫描承诺(加密选票的哈希值),并在投票机上选择“挑战”。
-
投票机将标记好的选票和随机因素传输到Alice的手机(例如通过视频二维码)。手机通过重新计算承诺(使用标记好的选票和随机因素)来检查承诺,并将其与第4步中扫描的承诺进行比较。如果它们相同,投票机对其投票的加密是诚实的。如果不同,投票机作弊,现在已被抓住。
-
Alice检查手机上显示的标记好的选票与她输入投票机的选票是否相同。
-
Alice对投票机通过挑战感到满意后,返回第1步,(可选)重新标记她的选票。Alice可以重复协议,直到她按照第3步投出选票。
投票机必须在知道是否会受到挑战之前产生承诺。如果投票机试图作弊(更改选票),它不知道是否会受到挑战,或者选票是否会在它必须对加密选票的密文做出承诺之前被投出。这意味着投票机任何作弊尝试都将有可能被抓住。
在选举的背景下,Benaloh挑战确保系统性地作弊的投票机将以非常高的概率被发现。虽然更改极少数选票可能不会被察觉,但每次投票机作弊时,如果它误判用户可能选择何时挑战,它就有被抓住的风险。
贡献者
依赖项
~0.8–1.4MB
~31K SLoC