能否設計出「可以杜絕主辦方作弊的」匿名投票系統?

題干最近更新於2015年10月21日07:36,請在問題日誌看一下最近修改的部分,謝謝!

感謝 @周欣宇 給出了非常詳細的方案,我個人感覺沒有什麼破綻了,各位高手如果有興趣歡迎給下面的答案找一找有沒有破綻,謝謝!

後面加粗的一些名詞都是我瞎編的,僅僅為了討論方便。我沒學過密碼學,不清楚這些詞有沒有更嚴謹、更恰當的術語來進行表示,如果有,歡迎指出,多謝!!

——————————————————以下是正文——————————————————

1、匿名性(請最好詳細說明一下,因為這裡面很可能可能出漏洞,謝謝!)

(1)每個參與者以及主辦方都不能查出別人的選擇的情況。

(2)確保每個匿名身份都有權利投票,一是排除無權投票的人參與,二是排除一人偽造多張選票。

2、有效性:每個人都能確保自己的票被真實計入,並且主辦方沒有添加多餘的選票。

比如我yy的一種實現方式是,

有一種驗證系統,具有可警告性,能讓參與者發現自己的票是否被篡改;

被篡改時,能匿名警告所有其他參與者主辦方在作弊,但是可以通過一些關鍵信息說服其他參與者兩件事:(1)警告發出者者自己沒有撒謊,(2)主辦方作弊證據確鑿。比如以有關驗證碼的數學計算為依據。

3、不採信第三方(包括政府,因為可能就是主辦方),而且最好即使動用一個國家大部分的算力也不能在短時間內破解出來。能容納的參與者越多越好,比如15億。(但不代表我支持或不支持所有人都有權利投票)

——————————————————偷偷再加一條————————————————

4、其實是重複的,不過想特別說一下別忘記排除主辦方偽裝身份、刪除投票數據造假的情況以及匿名者用多個身份投多張票的造假情況。


最近見到類似問題的領域:Secret Voting Scheme。主要解決電子投票方案中的如下問題(安全的電子投票方案及其匿名性的研究):

私密性:除了投票人自己,沒有人能把選票內容和投票人聯繫起來。

完備性:所有的有效投票都能正確被計算在投票結果內。

有效性:不誠實的投票者不會影響投票的結果。

不可重用性:所有的投票者只能投一次。

合法性:只有合法的投票者才能投票。

公平性:在選舉的所有階段結束前沒有人能夠提前知道選舉的中間結果。

除此之外,還有「投票後離開」等需求,用於解決大規模投票人參與的問題。 第一個適於大規模選舉的基於盲簽名的著名電子投票方案是FOO92方案(A. Fujioka, T. Okamoto, K. Ohta, A practical secret voting scheme for largescale election)。

具體細節還在學習,如果有進展再過來同步。

========================

20151021更新:

FOO方案是以3個提出者(A. Fujioka, T. Okamoto, K. Ohta)的姓的首字母而命名的。此方案是基於盲簽名的,而盲簽名正好是保證投票者的私密性(即匿名性)和合法性(即身份鑒別)之間不衝突的關鍵步驟。

盲簽名(Blind Signature),指的是簽名機構在無法獲知數據內容的前提下,對數據進行簽名的方案。簽名機構在簽名前可以驗證來源的有效性,但是在簽名後,無法通過簽名追溯到數據來源。打個比方,投票者將自己的選票密封到信封中,然後交給簽名機構。簽名機構通過信封上的地址確認投票者的身份,然後在信封上打上鋼印。信封回到投票者手上後,投票者從中取出選票,看見上面有隔著信封的鋼印痕迹,表明選票的合法性得到了確認,但是選票內容並沒有泄漏。

在FOO方案下,投票的流程為:

1.投票者對自己的選票進行加密並保存好密鑰。這一步與盲簽名無關,為的是保證選票內容不會被提前公布。

PS:這一步的處理,文獻中稱為比特承諾技術,但我沒有發現這一步中它與我理解的的加密演算法有什麼區別,暫且按我的理解描述。

2.投票者通過盲簽名機制,從簽名機構得到簽名後的加密選票。這裡簽名機構在驗證投票者身份時,除了身份信息外,還包括投票者對發送的數據進行的數字簽名,從而保證投票者的合法性。此外,簽名機構還需要拒絕同一投票者的多次簽名請求,保證不可重用性。

3.投票者拿到有效的加密選票後,通過匿名途徑將選票發給統計者。這裡沒有對匿名途徑進行詳細說明,大概是由於純匿名性比「匿名+身份驗證」更容易實現。實踐中,一般使用的是mix net作為匿名信道。

4.統計者公布所有的有效選票,即被簽名機構簽名認可的選票。投票者在其中尋找自己的選票,如果沒有找到則可以提出異議。

5.如果沒有異議,投票者通過匿名途徑將選票解密密鑰發送給統計者,統計者用密鑰解開選票內容,並公布所有密鑰和結果。

在這個方案中,完備性是靠所有投票者合作完成的,即每個投票者只能檢驗自己的投票是否在公布的列表中,而不能檢查別人的投票。這樣就要求:

1.每個人都有檢查投票的義務。如果不檢查投票的人比例較高,統計者就可以依照一定的概率偽造選票。(偽造選票需要與簽名機構合謀,下同。)

2.每個人都有投票的義務,無法棄權。如果有效的選票數少於合法投票者人數,統計者就可以偽造不存在的選票。(當然可以投棄權票,但投完票後仍然要進行檢查投票等後續步驟。)

3.如果投票者沒有找到自己的選票,提出異議的時候需要公布自己從簽名機構拿到的簽名選票,證明自己的合法身份,但這樣一來會對匿名性造成影響。

4.從技術而言,如果兩個投票者的選票內容一樣,同時選取了同樣的密鑰進行加密,則他們發給統計者的簽名選票有可能是相同的。在這種情況下,統計者有可能丟棄其中一張選票,造成2中有效選票少於投票人數的情況,進一步偽造選票。

除此之外,FOO還存在投票者必須參與最後一步(發送解密密鑰),無法提前離開等不便,這些弱點都使得此方案在較大規模的選舉中難以應用。因此,後來提出了一些改進的方案,具體內容還在學習中……


不妨設被投票的對象有 m 個,投票者有 n 個。

  1. 首先主辦方隨便想一個素數,比如 7 ;然後他再在 1 到 m 之間隨便想一個整數,比如 3 。

  2. 它把 7^{3}=343寫到紙條上,傳遞給第一個投票者。

  3. 第一個投票者選擇一個不能被 343 整除的素數 p ,然後把 p^{k} 乘到 343 上(其中 k 為想投票的對象序號),把結果交給第二個投票者。

  4. 每一個投票者找一個不能被收到的紙條上的數整除的素數,然後把這個素數的k_{i}次方乘到這個數上並將新數字交給下一個投票者,k_{i}為想投票的對象。

  5. 主辦方用最後一個數字除以 343 ,將結果公布。

每個人都可以驗證,這個巨大無比的數字的素因子有 n 個,且自己添加的素因子的冪次和自己的投票是一致的,這樣這個結果數字就不會作弊。然後根據每個素因子的冪次計票即可。

從理論上講,因為素數有無窮多個,所以它可以容納任意大的 m 和 n 。

補充:唯一的問題就是第二個人可以知道第一個人的票,然而我想不出解決的辦法。


此答案有嚴重bug,暫時作廢,讓我想想有啥可以補救的辦法...

--------

更新:

原答案(在最後)貼出後,和題主進行了一些討論和完善,公布一下新的可能方案:

1. 核心演算法md5介紹:

hashlib - 廖雪峰的官方網站

一種摘要演算法,可以把任意數據(從一個位元組的字元串到幾個G的視頻)映射到32位由小寫字母和數字組成的字元串上

(例如how to use python hashlib - by Michael---&> 2d73d4f15c0db7f5ecb321b6a65e5d6d)。且任何一個字元的改變都會改變整個md5值。由於是一種丟失信息的映射方式,所以無法把md5密文轉換為原文;同時由於md5值很長,擁有36^32種可能,所以也幾乎無法偽造字元串使其映射為目標md5值。

總之就是一個原文推密文非常簡單,但用密文推原文和偽造目標密文的原文都幾乎不可能的演算法。且計算成本低,可以大規模使用。

2. 步驟:

(1)主辦方根據投票總人數(設為N)生成相應數量的隨機字元串(稱為字元串A),並轉化為md5值(稱為md5-a)。將md5-a分發給投票者(實名隨機領取)。

(2)每個投票者選定一個投票意向,以及一個任意字元串(稱為字元串B),並將投票意向、B和md5-a共同映射到一個新的md5值(稱為md5-b)。將md5-b匿名發送給主辦方。

(3)主辦方公示所有的md5-a和md5-b。

(4)投票者將投票意向和B的一部分(稱為B-p)匿名發送給主辦方。主辦方公示所有的投票意向和B(一一對應)。(投票意向+B稱為字元串C,投票意向+部分B稱為C-p)

這樣,md5-a、md5-b和C-p之間的聯繫只有每個投票者自己才能知道,充分的保證了匿名性。且主辦方不可能在最終投票結果揭曉前知道md5-a和md5-b的對應結果,也無法在獲得投票結果後修改之,否則便會有破綻。

3. 投票者投訴方式

任意投票者可在任意階段檢查公示庫,如果發現自己的任何一個字元串(md5-a或md5-b或C-p)不在庫內,都可以立刻提出投訴。由於只有md5-a能直接體現投票者身份,而只有C-p能體現投票者的投票意向,所以只要這兩條不被聯繫起來就可以保持匿名投票狀態。

投訴方式:

(1)如果缺少md5-a則直接公示自己的md5-a即可。此時尚未投票,不存在匿名問題

(2)如果缺少md5-b則公示自己的md5-a和md5-b即可。

(3)如果缺少C-p則公示自己的md5-b和完整的C。

每種方式都可以在保護自己匿名狀態的同時證明自己為參與者,保持匿名投票狀態,且證明主辦方作弊。

4. 如何防止作弊

以下是題主提出的一些(基於最早答案的)作弊手段和我的回答,也歡迎提出新的作弊方法進行討論。

(1)主辦方增加或刪除md5值

這個只要檢查md5-a和md5-b的數量即可。如果同時增加兩者,那麼相當於「摻水」,見(3)

(2)主辦方偷換md5值

只替換md5-a完全沒有意義;只替換md5-b會面臨投票者投訴;同時替換md5-a和md5-b雖然可以讓投票者無法自證身份,但由於不知道一一對應關係而做不到,如果不能做到一一對應就和只替換md5-b沒有有區別了。

(3)投票者使用多身份投票等

最早分發md5-a時即可解決這一問題,讓每個投票者只能實名領取一個md5-a,幾乎可以杜絕一切投票者單方面作弊的行為。啥?你說身份證也能造假?好吧...

5. 補充

這其實是一個非常暴力的方法,通過一個無法被破解的密文傳遞信息,且同時使用了三種監督方式:投票者(全體群眾)對主辦方的監督、主辦方對投票者的監督、投票者對投票者的監督。對任何一種投票方法來說,必須讓這三種監督同時成立才可以達成題主的要求。

至於具體如何匿名把md5和投票內容交給主辦方…這個就是行政問題了...只要是用到電腦就繞不開信息泄露,如果不假設電腦沒有信息泄露就只能重金委託第三方或者手動扔進投票箱了,這一點對任何一種投票方式都是等價的…

(什麼?你要用給雲彩染色的方式投票?)

-----------------以下為原答案-----------------

可以用摘要存儲的加密方式完成。

比如md5存儲,就是把任意字元串投射為一個32位的字元串(數字和小寫字母)。原字元串任何一個變化都會改變整個md5字元串的結果,且由於並非一對一轉換,而是缺失大量信息的「投射」,所以儘管密鑰是公開的,但卻無法從密文反推回明文。反過來也幾乎不可能找出一個字元串來生成任一個目標md5值。

總之就是一個原文推密文非常簡單,密文推原文和更改原文得到相同密文都幾乎不可能的演算法。

一個可能的步驟如下:

(1)每一個投票者選擇一個投票意向,加上一段任意文字(後面稱為「伴隨字元串」),一起組成一個字元串,算出md5值,把md5值匿名交給主辦方。

(2)主辦方公布全部md5值。

(3)所有人匿名把伴隨字元串和投票結果交給主辦方。(為進一步防止作弊可只發送部分伴隨字元串)

(4)主辦方把文字和投票結果進行公示

(5)所有投票者都可以檢查所有的md5公示庫和投票結果公示庫,如果自己的投票結果或伴隨字元串或md5中任意一個沒有出現在公示庫里,都可以進行投訴。

由於md5的特性,幾乎不可能偽造相同的md5值(36的32次方個不同的md5值),相對的,擁有生成md5的字元串的投票者可以輕易算出md5值以證明自己。先期公布md5值也杜絕了主辦方得知投票結果後可能的手腳。總數據量也並不大,有心人完全可以下載所有投票數據並一一檢查md5值。

當然,這是建立在所有投票者都不撒謊的情況下…

如果想杜絕投票者撒謊也好辦,主辦方先生成和投票者數量相同的隨機文字並算出md5,再把md5分發給投票者,投票者再用這個md5加上投票意向和伴隨文字生成md5返還,最後主辦方把最早這部分md5也公布出來就行了…反正就是互相加密就對了…


謝@曾加 邀請。

假設主辦方也運營這個投票系統的話,其實蠻難的,因為涉及到匿名保護和偽造身份鑒別的衝突問題。

為了很好地保護用戶的匿名,就很難防止主辦方偽造不存在的身份去投票,除非能確保每個用戶都參與投票,或者至少所有用戶都去驗證自己的投票狀況。

其次,核對每個用戶投票狀態的代碼和統計投票結果的代碼如何確保一致性,需要對投票系統進行代碼審計,同時還要對投票系統運行的代碼和被審計的代碼進行一致性審計,而這也是很難辦到的。

有人提出用公密鑰系統,問題是私鑰的分發過程是否可信也是個很大的問題,PKI系統還是至少要確保一個第三方可信的密鑰分發機構的。雖然SM9貌似可以無中心地生成密鑰對,但那個是自申明的,還是很難判斷唯一性。

實際操作過程中要確保安全性就更難了,運營方掌握了大量的數據和信息,還是比較容易能追蹤到投票者的。


比特幣

提供一個實現的簡單思路:

1.錢包地址與身份信息掛鉤,生成hash存在投票系統中,解決一人一票,投票匿名的問題(hash只做驗證用,無法從hash再推出錢包和身份信息)

2.身份信息需通過政府相關部門驗證,才能再第1步註冊

3.從錢包轉極小數額的錢給不同的地址進行投票,不同地址代表不同投票選項,只計入最早投的地址,保證不能多次投票

4.如果投票系統驗證錢包地址為已註冊,就計入投票系統網站,並且公示該投票hash和對應投的選項

整個投票可以保證公平,一人一票,幾乎無法造假,整個投票歷史以及投票情況可以從比特幣交易歷史裡面得知,不需要依靠投票系統的網站

主辦方在這裡面的作用只是記錄hash,生成投票地址和驗證hash,無法去造假,一旦造假肯定在交易歷史上會出問題

相關更成熟的方案可以參考:

http://www.v-initiative.org/

BitCongress | Decentralized Voting Platform

https://bitcoinmagazine.com/articles/blockchain-technology-key-secure-online-voting-1435443899


先來討論傳統的小型投票場景:所有投票者同時坐在同一間屋子裏,使用選票箱投票,然後當場開箱唱票。

在這個場景中,通過「選票進了箱子就無法分出哪一張是誰的票」來消除了找回這種票與投票人的對應關係的可能,從而實現匿名。然而若要讓讓參與者發現自己的票是否被篡改,票與投票人的對應關係就必須被保留,不能被刪除。

既要保留這種對應關係,又要實現匿名(也就是不讓主辦方知曉票與投票人的對應關係),唯一的辦法就是在選票上不使用實名,而是使用投票人自己的簽名。比如我生成隨機數 23D40A18,並寫到選票上,丟進選票箱。之後唱票時,我去關注寫著 23D40A18 的選票是否和我填寫時的內容一致就可以。

但是這種做法的侷限性在於,它只適用與當場開箱唱票的小型投票場景。若是投票後選票被運到一個地方統一計票,那麼我的身份就可能被找出來,從而喪失匿名性:爲了確認我有投票權並且我還尚未投過票,進入投票地點時我的身份證件應當被驗證過。假設今天那個投票點只有我一個人投票,那麼即使選票上沒有寫我的真實姓名,那唯一的一張票也顯然是我投的,於是匿名性不復存在。在線投票的情況一模一樣:爲了驗證我的投票權,主辦方會知道我的身份,於是我無法相信投票的匿名性。


我來介紹一個已經死掉的遊戲,這是在日本的2ch匿名論壇上曾經流行過的一個投票活動叫做「動畫最萌大賽」(アニメ最萌トーナメント,Anime Saimoe Tournament),是在當年播出的動畫中選出最萌的女性角色的投票活動。實際上這個投票活動使用的規則已經相當接近於題主的要求了。

投票分為以下的步驟:

  1. 參與投票的人訪問運營方指定的一個網站(稱為Code發行所),這個網站的程序會驗證訪問者的IP地址等信息,並且要求訪問者在第一次訪問之後保留cookies,並在至少一小時之後使用同樣的IP地址訪問。成功驗證之後,發行所會給訪問者一個特定格式的隨機字元串,稱為Code。注意在這個過程中,用戶是不需要給出自己的投票傾向的,因此運營方無法根據投票人的傾向來判斷是否應該允許投票。
  2. 投票人將自己的投票選項,再加上運營發行的code,以指定的格式一起貼到匿名版上的投票帖子裡面,如:[[AST17-xxxxxx-xxxx-xxxx]]&<&<鹿目まどか@xxx&>&>。匿名版運營是沒有管理許可權的,因此一旦貼出來所有人都可以看到
  3. 比賽結束的時候,Code發行所立即顯示今天所有的有效code,官方和參與人都可以使用自動程序進行計票,實際上就是用爬蟲程序將網頁爬下來然後做正則匹配。結果以程序計票結果為準。

使用這種方法,運營方只能控制哪些IP可以領取code,如何領取,code的總發行量等等,但無法控制領取到code的人如何投票,因此可以相對限制運營作弊的情況。投票的明細也是對所有人都公開的。

這個系統仍然有一些漏洞,首先運營方可能在結束前修改code列表,比如將其中一些code刪除,導致相應的票無效(在code列表出現前,誰也不能保證發出來的投票是有效的,還是故意偽造的無效票)。運營方導入的一個方法是每個發行的code都有連續的編號,當天發行的第一票尾號是00001,第二票是00002,這樣每個尾號應當唯一對應到一個code,如果插入或刪除一部分就會導致尾號對應不上。當然,運營方仍然可以將一部分code替換掉,讓大部分尾號保持不變,但如果這麼做的話,投票人雖然沒有直接證據證明自己的code被替換了,但統計上會出現偽造票數量異常的情況,容易引起懷疑。

對這個系統還可以做進一步的改進:

要徹底解決修改code列表的問題,可以進一步增加數字簽名,所謂數字簽名是指運營方公開自己的公鑰、然後用私鑰對自己發出的數字信息的摘要進行一次加密,所有人都可以用運營方公開的公鑰嘗試解密驗證,而只有保有私鑰的運營方才能發行出這樣的帶有簽名的信息,這樣如果有人公開了帶有數字簽名的code,運營方就無法抵賴。

最後仍然有一個漏洞:運營方可以通過後台,繞過驗證機制,大量給自己發行code,然後自己用匿名身份投出。解決這個漏洞的一個簡單方式是引入多個獨立的運營方,每個運營方有自己維護的code發行所,投票的人需要獲取所有的運營方的code才能進行投票,這樣每個獨立運營方只能繞開自己的驗證,而無法繞開其他運營方的驗證,如果運營方沒有合謀則無法操縱比賽。

實踐中這個遊戲主要遇到的問題還是參與者的作弊行為,因為VPN、VPS技術的普遍運用,基於IP地址的驗證基本失效。如果在中國舉辦,最好還是使用已經逐步實現實名認證(手機認證)的微信號、微博號等進行驗證比較好。可以通過獨立運營方的方式進行匿名化,用戶使用實名賬號OAuth登錄運營方1的網站,得到有運營方1簽名的auth_code,使用運營方1的auth_code到運營方2換取投票code,這樣運營方1不知道投票code與auth_code的對應關係,運營方2不知道實名賬號與auth_code的對應關係,就實現了code的匿名化。


參考各大萌戰即可


樓主的問題像是密碼學範疇的問題,先寫簡單的概念:

RSA是一種非對稱加密的演算法。分為公鑰和私鑰,公鑰加密的只有私鑰可以解密(公鑰不能解,提供投票者-&>主辦方的只寫功能),私鑰加密的只有公鑰可以解密(提供主辦方-&>投票者的只讀功能)

可以存在一對多的公私鑰,也可以一對一

樓主的原始需求(論一個簡單需求怎樣變得變態)

1、匿名性

1、這裡匿名想表達的是,每個參與者以及主辦方都不能查出別人的選擇的情況。

2、在此基礎上,每個人都能確保自己的票被真實計入

每個投票者創建一對公鑰和私鑰

主辦方創建一對公鑰和私鑰,公鑰公開給大家

每個人投票時,對自己的主鍵(身份證號)用公鑰加密,得到一次加密主鍵,再用主辦方公鑰加密,得到二次加密主鍵,用Tor或者什麼無法追蹤的網路,廣播或者交給主辦方,這個過程就是投票。

主辦方用自己的私鑰解密一次,得到一次加密主鍵,對結果進行唱票。

主辦方 公開二次加密主鍵、對應的一次加密主鍵、自己的公鑰,大家可以驗證一次加密主鍵用公鑰加密可以得到二次加密主鍵。

自己可以看到自己的一次加密主鍵在裡面,就是被計入了


End-to-end auditable voting systems 這是個 cs 問題。多年前就有方案設計,現在也早商業化了。


歪個樓。很多大神從技術的角度說了很多。但個人認為這個問題其實是社會學和心理學的範疇。想要通過技術來解決或者對舞弊行為加以限制,其實難度很大,而且得不償失。

我在這裡舉一個不相干的例子。還是幾年前當我在某酒店做門童的時候,遇到很多客人打不到車的時候,很多司機說收班了,不順路。那時候我們見到計程車司機恨不得跪下來求啊,求人家拉一個,到哪都行。當時我在想,現在LBS服務這麼發達,要是有個軟體可以把客人的行程通過網路發送給附近所有的司機,然後順路的計程車接單不就解決了這個問題么?這不就是利用互聯網把我們的生活改造的更智能,更美好么?

後來果然不止有我一個人有這個需求。所以市面上有了各種打車軟體。然後發生什麼了?

2015年的今天,當我在北京的大街上嘗試用打車軟體叫個車回家的時候,可能是因為訂單距離短,金額小,所以等半個小時也沒有人接單。好不容易有人接單了,這時來一條簡訊提示,軟體平台已為您的訂單補貼xx元。

你看,原來司機不肯接你才不是因為不順路呢。

扯的太遠。回到題目說的主辦方舞弊這件事情上來。我的觀點就是,不管你設計了多麼先進的演算法來避免作弊,在利益面前,再強大的科技也有漏洞可循。

因為最大的漏洞不在於技術,而在於人性。


結論:此問題無解。有其他想法懇請指教。

「排除一人偽造多張選票」與「可以防止主辦方作弊」這兩點個人覺得不可能都做到。想像這樣一個場景:

1. A患有精神分裂症,每1小時會在A1和A2兩個人格與記憶之間切換。

2. 投票開始後,A以A1和A2兩個身份進行了兩次投票。

問:A的這個行為會如何被系統認定違規?

答:

情形一主辦方檢查主辦方頒發的憑據發現A1和A2其實是一個人 ==&> 如果主辦方偏向於甲方,那麼主辦方可以自己偽造憑證,向投票箱投入大量的虛假的人的支持甲的選票。不可行。

情形二主辦方檢查投票者頒發的憑據發現A1和A2其實是一個人 ==&> 投票者是匿名的,那麼主辦方自己就可以作為匿名投票者偽造憑證。不可行。

情形三投票者檢查主辦方頒發的憑據發現A1和A2其實是一個人 ==&> 同情形一,不可行。

情形四投票者檢查投票者頒發的憑據發現A1和A2其實是一個人 ==&> 同情形二,不可行。

題主的問題是要可以用在15億人的情況下,這種情況和許多論文里研究的都不一樣:

1. 論文都是投票者都在會場,即每個投票者都可以知道真實投票人總數的情況下(比如人大會議)。

2. 到真實的15億的情況下時,如何保證投票人數是真實投票人總數而不被摻水?這個時候需要一個獨立於主辦方的權威者確定投票人數。(比如第三方根據真實戶籍信息確認,但是這種第三方是否存在,如何保證他們面對的戶籍信息是真實的又是另一回事了)僅僅靠主辦方和15億投票者這一點還是無法做到的。

寫了這麼多,發現還是讓主辦方內部分化,然後主辦方內部派別互相監督更簡單靠譜,摔


首先如果是現場投票,感覺大家只需要盯緊投票箱就差不多了。

我們來考慮網上投票∶

令h碼為一個多對一的hash函數。(比如h碼是md5)

假設有m個人投票,主辦方必須在投票前將人數的h碼公布,所有投票者都能獲取此h碼(投票結束後主辦方公布人數然後投票人可以通過加密成h碼然後驗證)

然後是投票系統。

每個人先抽籤得到一個順序,表示等待前面的人投完票後這個人才投票,不存在兩個人有相同順序。同時每個人投票時必須能夠實時看到投票結果,這樣自己投票的結果肯定出現了一次。最終根據主辦方公開給自己另外m-1個人的投票後的情況(只有總投票情況),通過約定好的方式加密成h碼(這一步僅僅是為了方便)然後與其他人得到的結果已經主辦方公布的結果對比即可。

如何抽籤得到順序而且不被主辦方所知呢?這個方法很多我就不具體說了。(其實按順序也是可能作弊的,主辦方可以通過偽造前面的人已經投完票從而讓這個人投票,解決這個問題可以這樣,每個人抽籤得到的不是順序,而是時刻,表示這個時刻投票)

如果人數不固定,那麼真沒辦法。

至於這m個人怎麼選,怎麼防止被收買,這個真沒辦法。


見了許多系統,還是找不到這不想作弊的主辦方。


1.先確定所有投票者(如果主辦方摻水那麼無解)

2.用bitcoin中用的block chain記錄投票,主辦方要公開代碼供評審,投票要經過每個人自己的隨機密鑰簽名

3.每個人確認已投出,人數票數一致,且無人對結果有異議


題主,看到15億,大概也明白是什麼意思了。我相信必然存在不少方案,能實現題主要求。然而問題在於:為何主辦方要使用這種選舉方法來損害自己既得利益?

其實還有一個簡單直接的解決方案:多個舉辦方就可以了。


一人發一個激光手電筒,屏幕上出現候選人名單,讓所有人用激光手電筒照射選擇的候選人的名字。。


區塊鏈?


前台不限制投票,到最後統計階段,把重複投票去掉。


我最近也忙著拉票,我感覺這個過程好心酸啊好心酸,心好累,學校的那個系統說好了,沒人只能投一次,結果後來居然識別不了重複投的票,大家都赤裸裸地作弊。投票周期好長啊,十幾天,我真的很想不去管它啊,但是畢竟代表學院,而且畢竟之前付出了努力,我要爭取,不讓為我投票的人失望。我真的很很感謝他們,好愛好愛他們,但是我真心建議不要搞投票了好嗎!因為我不想利用和同學的關係,我只想跟他們那種沒有利益的交集,保持單純,因為他們都是我最愛的同學。希望大家都一切順利,明天醒來還要繼續拉票,嗯,晚安


推薦閱讀:

誰能最簡單的詳解橢圓曲線演算法,secp256k1 是如何生成公鑰和私鑰的?
疑似被新浪微博官方盜號,如何收集證據起訴?
將大於2的正整數分解成2個因數(不是質因數),並求其各結果間兩因數最小非負數差,這樣的數有研究的意義嗎?
密碼學如何入門,從什麼方向開始,能推薦書?
有什麼優秀的有關密碼學的書籍?

TAG:演算法 | 數學 | 邏輯 | 投票系統 | 密碼學 |