NuCypher 是一個滿久的項目了,最主要的目標是為隱私保護的應用提供基礎設施,包含了 Secret Management、Dynamic Access Control 與 Secure Computation。其中會用到的代理重加密這個功能,這篇文章將介紹 NuCypher 使用的代理重加密方法,他們命名為 Umbral,在西班牙文中這是 Threshold 的意思。
簡介代理重加密與 Umbral
Umbral 是一個門檻式代理重加密方法,首先我們需要先了解重加密是什麼。在現代生活中,雲端硬碟大概是絕大多數人都會使用到的服務,也經常會拿來做文件分享等等。而若今天我們需要提供一個文件給朋友,我們通常會上傳並建立一個連結,但更機密的資料我們可能就需要先加密再上傳,以保證服務商無法竊取或流出這個資料。然而加密之後,如果想要提供給另外一個人但不同密碼,我們就需要建立許多份副本。代理重加密則將這個過程交給雲端服務商,我們將一份加密的檔案上傳後,這些服務商透過重加密來產生對不同人的加密副本,就可以使我們避免重複加密。
在上面的流程中,我們可以分成三個角色:
- 加密方(Delegator)
- 解密方(Delegatee)
- 服務方(Proxy)
加密方會提供一個重加密密鑰
rk
給服務方,服務方可以拿著加密方產生的密文 c_a
和這把 rk
去重新加密成給別人的密文 c_b
,這套流程就稱作代理重加密。
代理重加密上有三個屬性:
- Directionality:如果服務方只能利用
rk
將c_a
轉換成c_b
,稱為 unidirectional,如果可以反過來則稱為 bidirectional。在代理重加密上,我們會希望他是 unidirectional 的,以避免解密方在使用他的密鑰產生密文後,被服務方與加密方共謀而洩漏其中的明文。 - Number of Hops:如果服務方對於
c_a
,在具備不同rk
下(例如給 Bob 和 Charlie 的)可以分別產生對應的c_?
則稱為 multi-hop/multi-use,否則稱為 single-hop/single-use。 - Interactivity:如果解密方的密鑰不需參與重加密密鑰的產生流程,則稱為 non-interactive,否則為 interactive。
對於這三個屬性,Umbral 是 unidirectional、multi-hop、non-interactive 的,此外,他也引入了非互動式零知識證明來提供重加密的可驗證性。
而 Umbral 的另一個特點,就是他是門檻式(Threshold)的,在前面的的簡介中只有一個 Proxy,一旦這個 Proxy 故障,那加密方與解密方就無法完成傳遞,因此透過 Threshold 的設計,例如可以建立一個 t of N 的代理重加密會話,只要 N 個 Proxy 有 t 個正常運作就可以確保傳遞順暢。
KEM/DEM Approach
Umbral 參考了美國國家標準協會提出的 ECIES-KEM,用到了稱為 KEM/DEM Approach 的方法。KEM/DEM Approach 是一種混合加密方式,透過混合非對稱與對稱加密,來提供足夠的安全性與加解密效率(非對稱的加解密通常較為耗能)。KEM Key Encapsulate Mechanism 會先產生一個對稱加密的密鑰,再透過 DEM Data Encapsulate Mechanism 則將傳遞的資料加密。
Shamir’s Secret Sharing
Umbral 中的 Threshold 特性透過 Shamir’s Secret Sharing 的方式來達成。Kimi 老師有一篇文在說這個,這邊就不展開了。
Implementation
https://github.com/nucypher/pyUmbral
Umbral 如何運作
這邊的 Alice 是上面的 Delegator,Bob 是 Delegatee。首先 Alice 會透過 Encapsulate 去產生對稱密鑰 K 和 Capsule,這個 Capsule 包含了讓 Bob 拿到 K 的資訊。接著 Alice 會對 Bob 產生 N 個 kFrag 並發送給 Proxy 們,Proxy 拿著 Capsule 和 kFrag 就可以產生 cFrag 並發送給 Bob,Bob 拿到 t 個 cFrag 就可以用自己的密鑰重組並解密出 K。
產生公開參數
首先會先產生一組 Parameter: 其中 G 是一個 order 為質數 q 的循環群,g 和 U 則是