Tuesday, August 4, 2020

Chameleon Signature 變色龍簽名入門

傳統電子簽名 (Conventional Digital Signature Algorithms)
傳統的電子簽名方法,例如 DSA / ECDSA 等,
主要可分為公鑰 (Public Key)私鑰 (Private Key) 以及簽署 (Signature / Digest) 三個部分。

例如,Alice 可以運用自己的私鑰,透過 DSA,得出一份加上了簽署的文件。
然後,Bob 就可以利用 Alice 的公鑰,透過驗證該簽署,去確認文件是由 Alice 所發出的。

過程中,當 Alice 簽署了這份文件,就代表她認同,電子簽署具有以下所有特性:

  • 不可偽造性 (Unforgeability): 因為只有 Alice 擁有私鑰,任何人都不可能輕易偽造一份合法的電子簽名,冒認 Alice 已經認可另一份文件。
  • 不可爭議性 (Non-Repudiation): 因為簽名難以偽造,一旦 Alice 簽署過這一份文件,她就不可能否認自己已經簽過。情況就有如銀行過數一樣,一旦成功操作,就不可逆轉。
  • 可傳播性 (Transferability): 同一個簽名,不但只 Bob 會相信。只要任何一個人擁有 Alice 的公鑰,只要私鑰沒有外泄,他們都一樣會相信 Alice 已經認可這份文件。

然後,有人就提出了一個問題:有沒有一種電子簽名,可以只保留部分特點?
於是,變色龍簽署 (Chameleon Signature) 應運而生。

---

變色龍電子簽名 (Chameleon Signature Algorithms)
在 1997 年左右,Krawczyk 與 Rabin 發表了一種算法 [1],
透過在 Hash Function 中加多一個後門 (trapdoor),達至「簽名不變,內容可篡改」的特性。

聽起上來,「可以篡改內容」的電子簽名,就像「沒有用」的簽名,
但實際上,情況卻正好相反,因為:

  • 假設 Alice 擁有 K 的公鑰、私鑰和後門,而 Bob 則只有 K 的公私鑰。當一份文件中包含了 K 簽名,這份文件就有可能是由 Alice 或 Bob 所簽署。所以,如果該文件是由 Bob 利用 K 簽發的話,除了 Alice 以外,沒有其他會相信 Bob:因為其他人會質疑 Bob 發出的文件,即使簽名不變、驗證也成功,但因為 Alice 有後門,所以她有可能偷偷改過內容。換句話說,文件中的簽名的可傳播性 (transferability),就降低到只有 Alice 與 Bob 之間:只有他們兩個,才知道真相如何。
  • 同一個例子,如果 Alice 真的偷偷改過文件內容,到「審判」的一天,Bob 就可以拿出原文件,證明自己清白:因為 Bob 沒有後門,要在短時間內,要找出可以產生同一個簽名的文件,幾乎不可能發生。所以,Bob 就可以用自己原文件,向「審判官」證明是 Alice 動了手腳,與己無尤。可見,這種簽名,仍然有一定程度的不可爭議性 (non-repudiatory)。
  • 其實整個系統,論安全性而言,基本上與傳統的 DSA 無異:如果黑客沒有私鑰或者後門,簽名同樣難以偽造 (unforgeable),所以仍然算得上安全。
---

變色龍簽名系統架構
由於涉及數論 (Number Theory) 及 Discrete Log Arithmetic,為避免鑽得太過深入,
以下只提及一些重要元件,數學推算內容則輕輕帶過。

變色龍散列 / 哈希函數 (Chameleon Hash)
  • 假設訊息為 m,修改過的訊息為 m',目標為:ChameleonHash(m) = ChameleonHash(m')
  • 只要達到以上目標,產生的簽名 σ = (CH(m), SK) 就自然不變。

初始化
  • 隨機產生後門 x  Zp,並計算出變色龍函數公鑰 K = (g, y) = (g, gx mod p)
  • 排除後門的話,它有點像 HMAC 的概念。

ChameleonHash 計算過程(使用公鑰 K 產生)
  • 隨機產生臨時變數 r
  • 計算出 CH = (gmyr mod p) = (gmgxr mod p) = (gm+xr mod p)
  • 最後得出 (m, r, CH)

ChameleonHash 驗證過程(使用公鑰 K)
  • 由於 r 已經提供,計算方法同上,得出 CH2,對比 CH 即可得出結果。

ChameleonHash 的後門 x 使用過程
  • 目標:假設已有 CH 及 m',利用 x 幫助找出 r' 的值。
  • 公式:移項後可得出 r' = [ ( m + xr - m' ) / x ] mod q
  • 結果得出 (m', r', CH),當中即使 m 已經改變,但 r 同時更新,故 CH 可以不變。
  • 如果黑客沒有 x,找出新的 r 將會變成 DLP 問題 (Discrete Log Problem)。

將 ChameleonHash 與簽名系統結合
  • 初始化:
    • 產生 Alice 的 DSA 公私鑰 PKA 及 SKA(或稱為私鑰 S)
    • 產生 ID,CH 的公鑰 K(或稱為公鑰 R)及後門 x
  • 簽名:
    • 簽署者擁有 K, PKA, SKA
    • 使用 K 將訊息 m 進行 Chameleon Hash,得出結果 Digest = (m, r, CH)
    • 將結果加上 ID,並以 Alice 的私鑰進行 DSA 簽署,得出 σ = SignSKA(CH || ID)
    • 最後,整個訊息為 (m, r, σ)
  • 驗證:
    • 任何人均擁有 K, PKA
    • 收到 (m, r, σ) 後,使用 K 及 r 將訊息 m 進行 Chameleon Hash,得出結果 CH
    • 將結果加上 ID,再以 DSA 驗證,得出 Result = VerifyPKA((CH || ID), σ)
  • 修改內容:
    • 修改者需擁有 K 及 x
    • 擁有 x 的人可以選擇修改內容(由 m 變成 m'),並得出新的 r 值(r')
    • 由於 Chameleon Hash 值一致,所以不用重新進行 DSA 簽名
    • 結果得出 (m', r', σ)

如是者,系統將有公鑰 (Public Key) 、私鑰 (Private Key) 、變色龍公鑰 (K)變色龍後門 (Trapdoor x),以及簽署 (Signature / Digest) 五個部分。

---

變色龍簽名(或散列)的應用
現實生活中,這種簽名的應用仍未普及,以下為一些可行例子:
  • 公開記帳系統 (Open Ledger) [2]:
    假設 Alice 想給 Bob 10% 的家財,Alice 可以立下單據,並用 Bob 的給予的變色龍公鑰 K 及自己的電子簽名私鑰 SK 進行變色龍簽名,然後將簽名公開。這樣,每一個外人都可以見證這一個簽名,但卻不會完全相信 Alice 與 Bob 之間的約定(因為 Bob 有後門可以修改內容)。這種方法,可以以保障 Alice 和 Bob 之間的約定,有多人見證,但同時也不會因外人妒忌,而影響自己的人身安全。假若有一天,Bob 真的偷偷改掉內容,Alice 只需向大家公開原單據,就可以證明自己清白。
  • 可修改式區塊鏈 (Redactable Blockchain):
    在一些私人區塊鏈中,給予某方(例如管理層)最大權力,保留可改性,可以防止因為錯誤決定,或者資料問題,而導致整個系統不可用的情況。例如當 GPDR 私隱條例實施後,管理層就可以決定先暫停一下區塊鏈網絡,然後將所有敏感資料,從區塊鏈中擦去,最後重新啟動系統。系統根據 Longest Chain Rule,就會在日後自動抹去舊的區塊鏈,如是者,管理員就不必重新建立整個系統。
  • RUSH 5G Handover 系統:
    這篇由 Y. Zhang 發布的論文 [3],也提到 Chameleon Hash 的應用。
    內容主要是用作 mutual authentication。

---

參考:

[1]: Krawczyk, Hugo, and Tal Rabin. "Chameleon hashing and signatures." Internet-https://pdfs.semanticscholar.org/1c29/4428c76ba7d1d0bb5e1d1bc931138c092453.pdf (1997).

[2]: 哈希(Chameleon Hash)、零知识证明(Zero—Knowledge Proof)和广播加密相关知识, MUZIBing's BLOG, https://muzibing.github.io/2019/10/12/2019.10.12%EF%BC%8885%EF%BC%89/#%E4%B8%80%E3%80%81%E5%8F%98%E8%89%B2%E9%BE%99%E5%93%88%E5%B8%8C%EF%BC%88Chameleon-Hash%EF%BC%89

[3]: Y. Zhang, R. Deng, E. Bertino, and D. Zheng, “Robust and Universal Seamless Handover Authentication in 5G HetNets,” IEEE Trans. Dependable Secur. Comput., vol. 47907, no. c, pp. 1–1, 2019, doi: 10.1109/tdsc.2019.2927664.


Monday, July 27, 2020

Practical Byzantine Fault Tolerance (pBFT) 實用拜占庭容錯入門

入門:拜占庭將軍問題 (Byzantine Genreals Problem)
拜占庭帝國 (Byzantine Empire) 是一個幅員很廣的古代國家,
所以,軍隊之間要一起行動,必須先遠程溝通,協商,
獲得可靠的共識,最後一致進攻,才能成事。

不過,由於不同軍隊之間距離偏遠,古代每個將軍只能用密函互傳訊息。
同時,由於敵方也知道我方軍隊的兵力相當,
所以,它們也派了一些間諜將軍,希望可以傳一些錯誤的訊息,打亂我方的陣腳。

投票
假設我方有 7 個每個將軍,每人都可以傳一封密函給其他將軍一次。
這 7 個(故意選單數,避免票數打和)將軍當中,有 1 個是間諜,6 個是誠實的。
每個人需要投票表示「進攻」和「防守」,多數服從少數。

如果誠實的將軍中,有 3 位投贊成,3 位投反對,
間諜就可以向那 3 位投進攻的將軍表示投進攻,同時向那 3 位投防守的人表示投防守。

這樣,3 個贊成進攻的將軍,就會以為自己是大多數,所以進攻。
同時,3 個贊成防守的將軍,也會因為以為自己是大多數,所以防守。
最後,由於大家沒有可靠的共識 (reliable consensus),就會有人出兵,有人留城,
整個戰爭將會慘敗。

共識
假設進攻由一個將軍決定,當將軍們都收到其他將軍的肯定,就可以進攻。
現在,假設整個帝國有 6 個將軍,但每一個將軍都只收到 3 封回音。

如果原因是因為,有 2 個將軍的飛馬傳信失敗,同時又有 2 個成功的傳信是來自間諜。
這樣,憑著收回來的 3 個訊息(2 個來自間諜,1 個來自將軍。有 2 封掉失,1 封自己),
將軍也無法肯定是否應該進攻。

科學家稱這兩種攻擊方法為「拜占庭攻擊 (Byzantine Attack)」,
而這兩種錯誤的情況,則稱之為「拜占庭錯誤 (Byzantine Fault)」。

解決方法:CFT 與 BFT
現今世界中,共識算法 (Consensus Algorithm) 正正就是解決以上問題的重要工具。
共識算法主要可分為兩種: Crash Fault Tolerance (CFT) 和 Byzantine Fault Tolerance (BFT)。

CFT 主要指將軍沒有回應,或者訊息間傳遞失敗;
而 BFT 則更進一步,既針對訊息傳遞問題,也考慮到會有間諜在其中作惡。

Practical Byzantine Fault Tolerance (pBFT) 實用拜占庭容錯
在 1999 年,Miguel Castro 及 Barbara Liskov 提出了一個針對 BFT 的解決方案,稱為 pBFT。

假設有 f 個間諜的話,pBFT 需要有 3f+1 個節點 (replica),才能要防止間諜影響共識。
換句話說,在 7 個節點的系統,如果運行 pBFT,只容許有 2 個間諜存在 (3*2+1=7)。

當中 3f+1 的證法比較複雜,詳細可參考 [2] 中的證法。有另一個證法:
假設系統中有 R 個節點,當中有 k 個忠誠節點,有 f 個非法節點。
如果目前 k 個忠誠節點中,有  f 個下了線,然後 f 個非法節點又同時發出假消息,
要阻止假消息「成真」,剩餘的 k-f 必須要比 f 大,
所以得出 k-f > f,也就是 k > 2f,
因為 R = k+f,所以也得出 R-f > 2f,也就是 R > 3f。

整個系統有五大階段:

1. Request: 
用戶 (Request Client) 發送一個 request 去主節點去寫入訊息 m。

2. Pre-Prepare: 
主節點會以 multicast 形式,發送 Pre-Prepare 指令去其他各節點。

3. Prepare: 
當每一個節點收到來自其他節點的 Pre-Prepare,並且驗證過內容為相同及正確後,
就會以 multicast 發送 Prepare 去其他節點。

4. Commit:
當各節點收到 2f+1(包括它自己)的 Prepare 訊息後,就會進入 Prepared 狀態。
然後,各節點就會發送 Commit 去其他節點。

5. Reply:
當各節點收到 2f+1(包括它自己)的 Commit 訊息後,就會進入 Committed 狀態。
然後,各節點就會傳送 Reply 給 Request Client。
當 Client 收到最少 f+1 (還是 2f+1?)個 Reply,就可以確認整個系統已經寫入共識 m。

6. Checkpoint:
系統會偶爾用 checkpoint 作為舊記錄的封存,
以防止他日重開系統,需要由頭開始計起(及驗證)共識值。


pBFT 的潛在問題
pBFT 有以下兩個主要特點:

  • pBFT 假設 malicious node 只是行為怪異,但並不考慮資料外泄問題。
    換言之,pBFT 只能在相信每一個 replica 中的資料並不私隱的情況下,才能運作。
  • pBFT 需要大量的 multicast 訊息傳播。
    當系統變得越大,訊息量將會指數性增加,令系統負擔變大。


---

參考:

[1]: Castro, Miguel, and Barbara Liskov. "Practical Byzantine fault tolerance." OSDI. Vol. 99. No. 1999. 1999. (http://pmg.csail.mit.edu/papers/osdi99.pdf)

[2]: Bracha, Gabriel, and Sam Toueg. "Asynchronous consensus and broadcast protocols." Journal of the ACM (JACM) 32.4 (1985): 824-840.(https://zoo.cs.yale.edu/classes/cs426/2012/bib/bracha85asynchronous.pdf)

[3]: https://medium.com/coinmonks/pbft-understanding-the-algorithm-b7a7869650ae

[4]: https://zhuanlan.zhihu.com/p/56780298



Monday, June 29, 2020

PyTorch 入門:使用 ResNet9 辨識鳥類品種

前言
機器學習(Machine Learning,下稱 ML)在近年越來越備受關注,因為它透過模仿神經細胞的結構,能在一大堆數據中,找出資料和結果之間的線性 (linear relationship) 和非線性關係 (non-linear relationship)。例如,假設有極大量不同的動物圖片,它能透過這些圖片,找出不同動物的特性(例如顏色、眼晴等),從而「學會」判斷不同動物。

筆者大約在六七年前,仍在大學二年級左右,已經開始見到有人在 Kaggle 中運用 ML 玩簡單的推算遊戲,以及用來訓練股票系統。當年,筆者只接觸過關於 linear regression 和 multi-layer perceptron 這些基本的機器學習概念。但由於 ML 涉及的數學太多、效率也不太高,所以筆者也放棄深究下去。直至 2015 年,DeepMind 運用 deep neural network 學習圍棋玩法,並挑贏了世界冠軍,ML 就開始變成熱門話題。時至今日,ML 發展速度越來越快,幾乎每天都有新的 training model 和 neural network 誕生。

有見及此,筆者為了 catch up 一下科技進步,參加了 Deep Learning with PyTorch 的網上課程。以下的內容,正正就是 course project 的一部分。

簡介
本次實作基於一個鳥類資料庫。資料庫中有 200 種不同鳥類,每種鳥類 5 張彩色圖片,總共 1000 張圖片。目的是建立一個可以認到 200 種鳥類的神經網絡 (Neural Network)。

使用到的技術
卷積神經網絡 Convolutional Neural Network: 這裏是指由原本 224*224*3(224 像素的正方形圖片,三原色 RGB),演變成長闊數值少,但深度變深(512*20*20,512 層,每層 20*20 px)的一種深度神經網絡。背後概念主要是,透過將層數變多,就能使每一層反映的意義更加精準。例如:原本彩色圖片只有 3 層,代表三種顏色。但當變成 64 層,就可以用第一層表示輪廓、第二層表示黑白比例、第三層表示眼晴數目等等。而同時,當像素變少,物件辨識的演算法就能夠更歸納化,不會因為物件向左右移動了些少,就認不到內容。

Residual Connection 殘差連接:這裏是指在 CNN 的結果中,加回輸入值的做法。由於 ML 的重點是降低 loss function 的數值 (loss function's results minimization),透過加回輸入值,loss function 就更能反映出輸入與輸出的關係(減去了因為輸入值大少的影響)。具體邏輯可以看成品中的解說。

Data Augmentation 數據增強:原本是指將現有的圖片改一下,然後放入 training set 去增加取樣率。但這個 project 中運用的,作用並不是增加取樣率,而是由於數據有限,我們不希望神經網絡記錯一些過於特殊的細節,反而沒有找到同品種鳥類的共通點。例如它可能記了綠色背景,卻沒有記住鳥的形狀(也就是擬合過度 overfitting)。這種過程,也稱作歸納化 (generalization)。

Adam Optimizer:由於 ML 的重點在於 loss function's results minimization,如果只用傳統的 Stochastic Gradient Descent,只看斜率變化,就有機會找不到 global maxima,或者會出現跳動。運用這個 optimizer 就可以預測跳動,從而調節 learning rate。具體來講十分複雜,算是 ML 的專業學術範疇,所以不在此詳述。

CUDA 硬體加速:由於顯示卡計算 matrix 加減乘法比普通的處理器快 (general purpose CPU),所以本次使用了 NVIDIA 的加速功能去計算 tensors 的斜率變化。

成品
筆者由於不太熟習 PyTorch,故此只基於 Lecture 5 作出以下小改:
  • 將資料改成鳥類
  • 將 training set, validation set 和 testing set 分開
  • 取消了 data normalization(因考慮到鳥類的顏色比例很重要,而且很麻煩)
  • 加減了一些不必要的 code blocks 和 comments
結果如下:


準確率
由完全隨機開始訓練,結果能去到大約 87% 準確率,有點意想不到呢。
如果有時間的話,筆者會再 post 一下使用 pre-trained model 的結果,我相信應該更好。

參考
https://jovian.ml/forum/t/lecture-5-data-augmentation-regularization-and-resnets/1546