#投票 #挑战 #设备 #不可信 #交互式 #benaloh

benaloh-challenge

实现了Benaloh Challenge(也称为交互式设备挑战),这是一种密码学技术,用于确保不可信设备的诚实性

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 密码学

MIT/Apache

27KB
277

Benaloh Challenge

Build Status codecov docs patreon flattr

实现了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保证它已正确加密选票且未更改她的选票,同时不让她知道它在加密中使用的秘密随机因素。

  1. Alice在投票机上标记她的选票。

  2. 当Alice完成时,投票机使用RNG的随机因素加密她的标记选票,并向Alice展示加密选票的单一哈希值(例如,通过QR码)。这个单一哈希值被称为承诺。投票机向Alice提供两个选项:她可以选择“投票”或“挑战”。

  3. 如果Alice选择“投票”,则投票机将加密的选票写入磁盘,过程结束。

  4. 如果Alice希望“挑战”,她将使用手机扫描承诺(加密选票的哈希值),并在投票机上选择“挑战”。

  5. 投票机将标记好的选票和随机因素传输到Alice的手机(例如通过视频二维码)。手机通过重新计算承诺(使用标记好的选票和随机因素)来检查承诺,并将其与第4步中扫描的承诺进行比较。如果它们相同,投票机对其投票的加密是诚实的。如果不同,投票机作弊,现在已被抓住。

  6. Alice检查手机上显示的标记好的选票与她输入投票机的选票是否相同。

  7. Alice对投票机通过挑战感到满意后,返回第1步,(可选)重新标记她的选票。Alice可以重复协议,直到她按照第3步投出选票。

投票机必须在知道是否会受到挑战之前产生承诺。如果投票机试图作弊(更改选票),它不知道是否会受到挑战,或者选票是否会在它必须对加密选票的密文做出承诺之前被投出。这意味着投票机任何作弊尝试都将有可能被抓住。

在选举的背景下,Benaloh挑战确保系统性地作弊的投票机将以非常高的概率被发现。虽然更改极少数选票可能不会被察觉,但每次投票机作弊时,如果它误判用户可能选择何时挑战,它就有被抓住的风险。

贡献者

  1. Patrick Hayes (linkedin) (github) - 可雇佣。

依赖项

~0.8–1.4MB
~31K SLoC