近期有小夥伴諮詢零知識證實入門問題,現就本人(非密碼學專業小白) 學習零知識證實 進行小總結:git
-
關於數論和橢圓曲線基礎知識:能夠看《Elliptic Curves Number Theory and Cryptography(second edition)》,有助於掃盲。github
-
實用的數學軟件:sageMath(開源免費)、Magma(需受權),可是Magma提供了在線版本供免費實用:Magma Calculator。算法
-
關於同態算法:所謂同態算法,是指基於密文的運算可反應明文的真實關係,經常使用於零知識證實的驗證環節。如 e ( g x , g y ) = e ( g , g x y ) e(g^x,g^y)=e(g,g^{xy}) e(gx,gy)=e(g,gxy)具備乘法同態屬性, g x ⋅ g y = g x + y g^x\cdot g^y=g^{x+y} gx⋅gy=gx+y具備加法同態屬性。編程
-
關於pairing:pairing具備同態乘法屬性,pairing算法可分爲eta pairing、ate pairing、Weil pairing、Tate pairing等等,具體的pairing算法基礎,可參看 Craig Costello的《Pairings for beginners》,內附Magma代碼,直觀好懂。安全
-
關於commitment:能夠參看《From Zero (Knowledge) to Bulletproof》,理解橢圓曲線下的pedersen commitment 具備 加法同態屬性。也可參看本人博客 橢圓曲線形式下的Pedersen commitment——vector commitment和polynomial commitment
編程語言 -
關於group:一般接觸的group有:pairing-friendly group、unknown order group、known order group等。學習
-
關於密碼學假設:密碼學假設是指某個數學難題,假設其很難解決,常見的數學難題有 discrete logarithm problem、factoring、pairing、lattice等等。可參見 2013年報告《Final Report on Main Computational Assumptions in Cryptography》,也可參見本人博客 主流的密碼學 hardness/computational 假設。區塊鏈
-
關於編程語言:github上 C++、Rust、Go、Python、Haskell等相應的實現都很多,最新的一些論文算法實現不少都是基於Rust的。Rust爲系統安全的靜態語言,若是有志於當coder,值得學習。spa
-
零知識證實資料庫:Awesome zero knowledge proofs (zkp) 中包含了當前各類主流的零知識證實算法,可選擇感興趣的方向深刻了解。.net
-
零知識證實中的角色:
Prover:知道祕密的那我的。
Verifier:不知道密碼,可是想要求證Prover是否真的知道該祕密。
舉個例子:
– public instance: y , g y,g y,g(Verifier和Prover都知道)
– witness: x x x (僅Prover知道)
– relation: y = g x y=g^x y=gx(Verifier想求證的關係 或 Prover想證實的關係)
經典的證實方式爲利用 sigma protocol(核心思想爲commit-and-prove),詳細可參看本人博客 基於Sigma protocol實現的零知識證實protocol集錦
。 -
零知識證實的應用: 如隱藏區塊鏈中的交易金額、交易對手方等(Monero/Zcash); 壓縮存儲空間(如Filecoin); 多方安全計算; 算力外包; 黑名單、白名單訪問控制; 隱私計算等等。