2018年12月12日 星期三

電子化不在籍的無記名投票

今年11月24日的九合一選舉,因為多了去鳥籠化的公投造成投票大卡關,最近又爆出有些選票上面的問題。以下是我想出來的電子化投票方法,目的是可以達成不在籍且投出來的票可以無記名,而且又能防止空白選票的產生。 ~若有問題請在留言區發言~

I. 流程說明

每個投票所有一條或是多條電子投票通道;每條電子投票通道有兩台不互相連線的機器
  • 代幣機:用來插入身份證件並提供投票代幣
  • 投票機:有觸控螢幕,投入投票代幣後就像提款機一樣,用來圈選選票
投票的步驟:
  1. 用身份證或是自然人憑證等身份證件,跟平常一樣人工確認身份沒有問題後,將身份證件插入代幣機,機器會吃入身份證,換取一個投票代幣出來
  2. 走到投票區,將代幣投入投票機,在螢幕上面圈選選票。確認無誤後,按下最後的確定完成投票,投票機會再歸還代幣
  3. 拿著代幣出來,投入代幣機,取回身份證件

II. 所需的雲端伺服器

首先要先說明這個電子化不在籍投票需要有下面幾台伺服器:
  1. 身份驗證機:會與投票所的代幣機連線,用來驗證某身份證件是否已經使用過
    • 對於每個身份,都有與之對應的一個質數p
    • 不同身份對應的質數p是不一樣的
    • 身份資料庫P = {p1, p2, ..., pN}, N是有投票權的公民數
    • 投票中資料庫I,存放正在使用中的身份質數
    • 全國只會有一台身份驗證機
  2. 代幣提供機:會與投票所的投票機連線,用來提供代幣
    • 存在與身份一樣多的代幣
    • 每個代幣的質數q皆不同
    • 代幣資料庫Q = {q1, q2, ..., qN}。Q和P是同一套質數集合
    • 代幣編碼庫K,存放正在使用中的代幣編碼
    • 全國只會有一台代幣提供機器
  3. 投票碼驗證機:會與身份驗證機、代幣提供機連線。
    • 從兩者給的部分資料中計算出可能存在的投票碼
    • 當代幣投入投票機連線後,會去詢問投票碼資料庫此代幣是否可用
    • 全國只會有一台來計算可能的投票碼
    • 可以將結果用cloud burst同步到各縣市或是各區的投票碼驗證機上,減輕伺服器的負擔
  4. 投票區塊鍊:會與各地投票所的投票機連線,將投票結果存在區塊練上。
    • 存放投票機裡面的已經投出的電子選票
    • 每個縣市或是每一區可以放一台,減輕伺服器的負擔

III. 詳細的運作流程

有了雲端伺服器與投票人的流程,下面說明詳細的運作流程:
  1. 身份證件插入代幣機後,代幣機身份驗證機連線
  2. 身份驗證機收到請求後,會做下面幾件事情:
    1. 若此身份已投過票,身份驗證會直接回傳代幣機,要求看這個身份發生甚麼問題為甚麼會重複投票(錯誤碼-1,中止後面的流程
      若此身份尚未投過票,將此身份標注成投票中,繼續下面流程
    2. 從投票中的身份拿出對應的身份質數p,加入目前的身份驗證機裡面的投票中資料庫I
    3. 隨機產生身份驗證碼j,回傳到代幣提供機,說明某特定代幣機將會透過身份驗證碼j,才能夠取得代幣
    4. 回傳代幣機;回傳此身份證可以使用,且給予身份質數p身份驗證碼j
  3. 代幣機用收到步驟2.3得到的身份驗證碼j後,向代幣提供機請求提供一個代幣
  4. 代幣驗證機收到代幣機請求後,比對代幣機身份驗證機所提供的身份驗證碼j是否相同,確認無誤後提供一個代幣
    1. 隨機從代幣資料庫Q中,取出一個沒有標示著已使用的代幣質數q,並標成已使用
    2. 隨機從代幣資料庫Q裡面抓出10個標示為已使用的質數q1, q2 ... q10,將這10個質數相乘得到r。若是要更加秘密,那可以取更多的已使用代幣質數
      r = q1*q2*...*q10
    3. 製作代幣編碼k,公式如下
      k = q*r
    4. 將發出去的代幣編碼k代幣編碼庫K
  5. 代幣機用步驟2.4得到的身份質數p與步驟4.4得到的代幣編碼k,製作投票碼v
    1. v = p*k 並將此投票碼v存到代幣中
    2. 將身份證件扣留在代幣機中,記住正在使用的投票碼v
    3. 吐出代幣,這個時候代幣裡面只存有投票碼v
  6. 投票碼驗證機每分鐘固定與身份驗證機拿詳細流程2.2裡面的投票中資料庫I、另外與代幣提供機拿流程4.4的代幣編碼庫K,兩兩相乘製作成投票碼資料庫S
    1. s = i*k 可能的投票碼s的計算方式
      • i是從投票中資料庫I拿出的任意一個身份質數i
      • k是從代幣編碼庫K拿出的任意一個使用中代幣編碼k
      • 由於是每分鐘才讀取一次,當下投票碼資料庫並不能夠知道身份質數i與其相對應的代幣編碼k。故必須要將投票中資料庫I的每個投票編號i分別都和代幣編碼庫K的每個k相乘。得到所有可能的投票碼s,存在可能投票碼資料庫S當中
    2. 每分鐘會刪除在可能投票碼資料庫S裡面存放超過30分鐘資料
  7. 代幣投入投票機,讀取代幣中從詳細流程5.3得到投票碼v,與投票碼驗證機裡面的可能投票碼資料庫S比對。
    1. 若此投票碼v不存在,每分鐘再去確認一次。超過5分鐘都不存在則代表此投票碼v可能是偽造的(回傳錯誤碼-2,終止後面的流程
      若此投票碼v存在可能投票碼資料庫S,代表此代幣是有效的
    2. 若是有10張選票,則投票碼驗證機可能投票碼資料庫S,隨機撈出10個非投票碼v的可能投票碼(稱之為選票編碼w),回傳給投票機。這10個可能的投票碼則註記已經使用,之後不會再使用當成選票編碼使用(因此每張選票只會有特定的一組不重複的編號)
    3. 使用觸控螢幕圈選選票,使用AI圖形辨識選票上面的結果,看是有效票還是無效票,看是圈選哪個選項等,當成是選票的結果
    4. 確認圈選沒問題後,每張選票都搭配著7.2得到的選票編碼w
    5. 投票機存放的每張選票上面都註記著唯一的選票編碼w
    6. 將標示著選票編碼w的選票結果上傳到投票區塊鏈上面。未來要是投票機存放的選票有問題,可以比對投票區塊鏈。若選票不存在區塊鏈上則可能是偽造的
    7. 將代幣從投票機吐出
  8. 走出圈票處,將代幣投回到一開始的代幣機
    1. 確認代幣的投票碼v是有效的(也就是發出去那個)
      若有更動,代表此代幣可能是偽造的(錯誤碼-3,扣留身份證件與人直到故障排除
    2. 告訴身份驗證機,將在資料庫P裡面的身份質數p從投票中標示成已投票
      身份驗證機刪除投票中資料庫I身份質數p
    3. 告訴代幣提供機,刪除代幣編碼庫K的代幣編碼k
    4. 消除代幣上面的投票碼v(代幣可重複使用)
    5. 吐出身份證件

IV. 技術說明與補充

  1. 此方法基於很大的數字做質因數分解計算量會很大
  2. 這方法可以同時並行於傳統投票方式,只要在傳統投票所領票的時候多給一台機器來驗證某身份是否已經投票即可。
  3. 電子化:此方法使用的都是電子產品
  4. 不在籍:此方法並不要求必須必須在戶籍所在投票所投票,但還是必須要在投票所才能夠投票。規定在投票所投票可以多一道傳統手續辨識身份,且當有投票問題的時候,馬上可以查驗出問題的投票者身份
  5. 無記名:每張選票都有一個選票編號w,此編號是隨機從可能投票資料庫S撈出來的;而可能投票資料庫S裡面的是透過所有正在投票的人的資料相乘交雜出來。同時在投票的人數很多,相乘交雜出來裡面會有許多並不存在的編號,反查回去也可能找不到人
  6. 無記名:即使投票機刻意紀錄,也只能夠記錄到某張選票的是由投票碼v的人投下(正常是應該只紀錄選票編碼w,不應該存放投票碼v)。要找到投票碼v的持有人,要做大數的質因數分解,將會花掉許多計算時間;即便是分解出來,因為投票碼v是由p*q*r,裡面包含了許多人的資訊,也無法指定此選票是由誰投出
  7. 計算量最大的應該是投票碼驗證機。假設全國某分鐘內同時有ˇ30,000個人在投票,那麼必須要在一分鐘內做完30,000*30,000 = 9e8次乘法運算,九億次乘法。另外還要在將這些資料存在可能投票碼資料庫S
    這應該是此方法技術上面最困難的部分
  8. 上述這麼大量的資料有個好處是,這個可能投票碼資料庫S裡面只有只有很小部分是真實存在組合,其他都是虛構的組合。選票編號是隨機從這個資料庫裡面撈出來的,故即使解析選票,花很多時間做質因數分解後得到的也很可能不含選舉人的資訊
  9. 此方法使用了數位化、雲端、大數據、區塊鏈、AI圖形辨識、邊緣運算等技術~
_EOF_

1 則留言:

  1. 有個漏洞在。若手上已經有身份資料庫P裡面所有的質數,且能夠讓投票機偷偷紀錄某張選票是由哪個投票碼v投出,那麼就可以快速的解析出來p, q, r(r=q1*q2*...*q10)。這個時候就可以知道某張票是由p, q, q1, ..., q10等其中一人所投出,雖然不能夠直接指定是誰,但還是可以猜可能是誰

    這個時候只能夠加大步驟4.2裡面的人數,多用幾個人下去混出來r,來保護投票的秘密性

    回覆刪除