Keys

如何在已知的有限人群中以數字方式分發一組匿名令牌以進行匿名投票?

  • July 18, 2022

TL:博士

我怎樣才能讓 N 人有機會隨機選擇一個令牌,每個人保證這些:

  • 沒有人知道別人的令牌。
  • 沒有人可以選擇多個令牌。
  • 每個人都可以選擇是否選擇令牌。

所以對於 N 個人來說,在時間視窗之後,有 M 個被挑選的代幣和 NM 個沒有被挑選的代幣,每個參與者在他的權力下要麼有 0 要麼有 1 個代幣。

這裡的關鍵是“nobody else”不僅指允許投票的N個人口,還包括“組織者”。例如,在網路中辨識並創建一個隨機令牌可能會導致灰帽系統管理員記錄“誰選擇了哪個令牌”,這違反了規則。

細節

我們在“物理紙”的幫助下做到了這一點。但我不知道如何以數字方式模擬這一點。

看故事:我們定期在某些人群中進行匿名民意調查,結果被認為具有約束力。例如,假設這些人是討論公司內部自動組織的員工。或者社會中決定籌集資金的股東。或者家族企業的老闆決定解僱一名家庭成員。

由於問題的類型,假設我們需要對每個成員的意見保密。我們仍然需要透明度,每個人都知道結果沒有被欺騙。

我們目前使用的方法允許以下規則:

  • 必須確定選民(很像在真正的政府選舉中)才能參與(封閉式選舉)。
  • 每個參與者都可以投票或不投票。
  • 每個參與者可以多次投票以改變主意並更改之前的投票。
  • 除非對方透露他的投票,否則每個參與者都不得發現其他隊友投票的內容。這包括“即使 Alice 在系統中有朋友”,她也無法發現 Bob 投票的內容。
  • 每個參與者都必須能夠將自己的投票審核到貢獻總額中。

這是一個封閉的人口普查,因此參與者的數量是有限的,並且在任何特定時間都是已知的。

這些年來我們是怎麼做到的?

為了這個例子,想像一下這個愚蠢的民意調查:

“我們應該罷工嗎?”

  • 是的,盡快
  • 是的,但首先我們需要澄清一下加薪

100名員工中的每一個人都想發表自己的意見,但又不想讓隊友知道自己的真實意見。如果是,他們就徹底罷工,如果不是,他們就去上班。

到目前為止我們是怎麼做的:

標記化部分

  1. 我們生成 100 個隨機令牌並在私鑰下加密發布。
  2. 我們在 100 張單獨的紙上列印了 100 個隨機令牌,並將它們放入信封中。一個人拿著 100 個信封。
  3. 員工有兩個時間視窗(比如“今天”)去挑選他的代幣和“今天和明天”投票。
  4. 每個員工都選擇去或不去選擇一個。
  5. 第一個去辨識。提供身份證明後,提供一套 100 個信封。如果他願意,員工可以洗牌。然後他隨機選擇了一個。
  6. 第二個去辨識。之後,他收到了 99 個提醒信封,他從中挑選了一個。
  7. 如果所有員工都去挑選一個,那麼身份登記處將有 100 個姓名和 0 個提醒信封。每個員工都可以使用或不使用它。
  8. 如果任何員工在時間視窗內沒有撿起信封(比如 85 個撿到,15 個沒有撿到),辨識列表中將有 85 個姓名 + 15 個提醒令牌打開。
  9. 時間視窗結束後,我們關閉物理提醒信封。

投票部分

  1. 在這一點上,每個員工都有一個其他人都不知道的代幣。
  2. 在網路中,他們使用令牌作為“選民 ID”
  3. 在時間視窗內,任何一個voter-ID都可以重新投票,最後一個是有效的。
  4. 在投票時間視窗之後,投票關閉,即使擁有從未使用過的紙幣,也沒有人可以投票。

結果部分

  1. 投票結束後,未使用的提醒代幣開放並引入系統。
  2. 公開了 100 個令牌列表的公鑰,每個人都可以解密它,所以現在每個人都“確切地”知道最初發行的 100 個令牌,並且將辨識該列表中的 15 個未選擇的令牌和他自己的令牌。
  3. 結果以表格的形式發布,有 2 列:Token + Voting 結果

因此結果是這樣的:

ATDER7 - Was not picked.
Z887OP - Picked, but did not cast a vote.
83KIER - Voted "Yes, ASAP"
UE87JY - Voted "Yes, ASAP"
IEOP91 - Voted "No"
[... list all tokens and results ...]
23GXQW - Was not picked.
87OKID - Voted "Yes, but first we need to clarify about the salary raise"

這保證了每個員工都可以說“是的,我的投票在那里為結果做出了貢獻”,並且每個員工都知道他沒有被騙。

之後,“贏家”選項被視為規則,每個人都同意“這是流行的情緒”。

大問題

我們如何才能在不破壞規則的情況下用全數字結果機制替換我們用紙做的“令牌分配部分”(即:沒有人可以選擇 2 個令牌,甚至系統管理員可能不知道“誰投票給了什麼” , ETC。)。

每個選民生成自己的 EC 密鑰對。

每個選民通過送出他們的公鑰和他們的真實身份來註冊投票。

註冊投票的所有公鑰集合與所有選民共享。

為了投票,每個選民都簽署一條消息,例如“是,盡快”,並帶有一個可連結的環簽名,包括所有其他已註冊的選民公鑰作為環的其他成員。

每個可連結的環簽名聲明一個“密鑰圖像”作為簽名的一部分。密鑰圖像對真實簽名者來說是唯一的,但是沒有外部觀察者(不知道真實簽名者的私鑰)可以知道密鑰圖像屬於哪個環成員公鑰。

密鑰映像的工作方式是,如果簽名者簽署另一條消息以送出另一次投票,他們不可避免地會被迫再次使用簽名聲明相同的密鑰映像(否則簽名將無法驗證)。

現在,很容易查看是否有人多次投票,如果選民重新投票,則丟棄之前的投票(因為相同的關鍵圖像會出現多次)。也很容易看到有多少獨特的關鍵圖像已送出,因此有多少獨特的選民投票。

所有送出的投票都可以與所有參與者共享,以便可以公開驗證簽名和檢查簽名消息。

對於未來的投票,只有新參與者需要註冊投票。然後,新參與者的公鑰分發給所有現有的選民。現有參與者將使用他們現有的密鑰對在未來的選舉中投票。

請注意,由於相同的關鍵圖像將出現在未來的選舉中,因此可以看到同一個人如何在多次選舉中投票(儘管沒有人能夠知道任何選民的真實身份)。

如果這是不可取的,您應該要求所有參與者為每次新的選舉註冊新的公鑰。他們可以通過簡單地送出一個新的公鑰並用他們的舊公鑰簽名來做到這一點。新公鑰的密鑰圖像將無法與舊公鑰的密鑰圖像連結,因此可以公開重新註冊送出。

引用自:https://crypto.stackexchange.com/questions/101046