heymrsalt
這是我的 Github 歡迎聯繫我🧂 https://github.com/HeyMrSalt
Intro & CTF
https://github.com/HeyMrSalt
Friendly Introduction
{0x01}
首先讓我們來談談 什麼是 proof 證明?
用生活上的舉例來說
若 Salt 今天想到小7買酒,店員會詢問 Salt 『你是否滿18歲了?』
而 Salt 若想買到酒一定會說『我超過18歲了』
但這只是 Salt 的 statement 一個陳述而已,這並不能證明 Salt 的真正年齡
然而一個常見的方法就是拿出身份證,透過上面的頭像與出生年月日來佐證一個事實陳述
這樣的官方證明資料,我們可以稱 evidence 證據
而這個方法我們可以稱 proof 證明
再讓我們來談談 什麼是 zero knowledge 零知識?
用剛剛的舉例來說
Salt 有辦法同時 不提供真實年齡 且 還說服店員『我真的超過18歲了』嗎?
在現今的社會似乎不太可能做到,由於現今我們大多依賴政府提供給我們的 trust 信任
像是由政府所擔保的 [1]身份證 [2]健保卡 [3]護照 等證明資料
這些資料讓 驗證者 能夠驗證 證明者 是否說謊
但這樣證明的過程中,也洩漏一些 知識 了...
然而如果 Salt 有方法 證明 自己超過18歲
且又能讓店員不知道 Salt 幾歲的話(無知識
那這就叫做 零知識證明
於本 Slide 中所介紹到的
零知識證明(Zero-Knowledge Proof)
將承諾盡可能使用少量的數學
期許讀者聽眾能 Zero Pressure 的聽完全程
本報告全程使用人話說話,並穿插些友善例子
如果讀者腦中突然浮現數學符號(例如 Σ、π 或 ⊕)
那不是我召喚的,是你以前數學老師的幽靈 👻
如有專業人士或密碼學學霸在場
於本 Slide 中的內容若出現錯誤,還請糾正與指教!
若您聽完本 Slide 後
因此喜歡上密碼學而放棄日常生活
本人將不負任何法律責任 XDDDDDDDD
聲明人簽名 :
報告日 : 20250410
本 Slide 內容為學術研究與學習之用途,嚴禁商業利用、出版或未經授權之修改。
舉個經典的 🌰
Alice 和 Bob 是從小一起長大的青梅竹馬,他倆彼此都是數獨狂熱愛好者。
平常他們的興趣就是 由其中一人設計困難的數獨題目 然後 拿給另一方去作答。
Bob
Alice
有天,Alice 出了一道極度困難的數獨題並拿給 Bob 去作答。
Bob 花了很多天去嘗試解開這個數獨難題,但是怎麼都解不出結果 ...
此時 Bob 懷疑 Alice 在耍他並跑去跟 Alice 抱怨說『妳是在整我吧?這題根本就無解啊!』
Bob
Alice
『我能證明給你看這題是有解的,而且我知道這個解』Alice 這樣淡定的回答他。
『好啊那妳證明給我看啊』此時 Bob 暗自想著『哼!等妳證明後我就記下答案也去整別人』
Alice 則回說『我會用零知識證明的方法證明我會這題的解,也就是說我不會把答案給你看』
Bob 則一臉不相信這有辦法做到,現在滿腦子想的都是別人被這題整的樣子。
Bob
Alice
Alice 接著將提出一種 證明 讓 Bob 能夠 驗證 卻又不洩漏答案的方法。
首先 Alice 準備了一張 紅白雙色雙面西卡紙 準備復刻題型。
Bob
Alice
接著將 紅白雙色雙面西卡紙 利用剪刀剪成 9x9 張的小卡 並把白色那面朝上放在桌上。
再用黑筆在小卡上寫上 1-9 的數字 把每個數字寫 9 次。然後就能請 Bob 暫時閉上眼睛。
Bob
Alice
成功寫好小卡後,應該會有 81 張數字小卡,再來按照題型所出現的數字及位子,去挑出相同數字小卡放置相同的位子來還原該題型。此時小卡還會剩下數張。
Bob
Alice
成功還原題型後,由於 Alice 知道解答,所以她有能力(知識)把剩餘的小卡放至對的位子
透過 每列每行每個區塊 皆符合數獨的規則,此時 Alice 足以證明自己擁有解答(知識)。
但這可還不是 零知識。
Bob
Alice
* 這邊的剩餘小卡使用紅字,是為了方便這頁 slide 閱讀,小卡上的數字皆為黑字。
接下來把『解答數字』數字那面朝下放在桌上,看到的會是紅色的那面。
將『題型數字』數字那面朝上放在桌上,看到的會是白色的那面加數字,即原題型。
此時 Bob 可以張開眼睛了 ...
Bob
Alice
💤
Bob 張開眼睛後,很興奮的表示終於準備要揭曉謎底,畢竟他解了很多天都沒解出來。
Alice 卻對 Bob 說『你不能偷看這些面朝下的卡片,但我能讓你 驗證 這些解,你可以任意選擇按照 Row 或按照 Column 或按照 3x3 的 Box 九宮格來 驗證 我的解』 Alice 才剛說完就能明顯看見 Bob 失望的臉色。畢竟他以為能看到完整的一個解。
Bob
Alice
3x3 Box
Column
Row
Bob 很困惑,按照 Alice 所說的可以任意選擇 驗證 Row/Column/Box 於是 Bob 向 Alice 回答『那我選 Row 不過這樣做到底能怎麼 驗證 』Alice 請 Bob 別急,並且把每一橫排的 9 張卡片收起來放到一個布袋,9 個橫排所以最後卡片會收在 9 個布袋裡,接著 Alice 搖了搖每個布袋,將裡面的卡片都給打散,最後把這 9 個布袋交給 Bob。
Bob
Alice
『好了,你可以打開這些布袋了』Alice 對 Bob 這麼說,『每個布袋裡都正好 9 張,且沒有重複的數字』Bob 打開每個布袋一看,每個布袋的結果皆如此。而這項 驗證 過程 Bob 可以請 Alice 重複實驗好幾次,只要 Alice 真的 知道 答案,這結果是不會變的。
Alice 成功用這項方法達到 證明自己知道知識 且 布袋任何的知識給驗證者。
Bob
Alice
不帶
Zero-Knowledge Proof(零知識證明)或 Zero-Knowledge Protocol(零知識協定)
也有些出處縮寫為 ZK
零知識證明是密碼學中,證明者(Prover)向驗證者(Verifier)證明某命題為 真 的方法,同時避免向驗證者傳達除陳述真實性之外的任何資訊。
Bob
Alice
Prover
Verifier
需具備三種核心特性
{0x02}
參與者:
證明者(Prover, P):知道秘密,要證明他知道
驗證者(Verifier, V):想要驗證證明者真的知道,但不希望知道秘密本身
證明語言 LLL:
是一個包含所有合法命題(或答案)的集合。證明者的任務是證明某個 x∈Lx \in L x ∈ L
互動過程:
採用典型的「挑戰-回應(challenge-response)」模式,是交互式的基本結構
零知識證明的基本架構與定義
*但現今的 zkp 挑戰-回應模式 已非必要項目 因為多了非交互式
- - -
完備性(Completeness):
若命題為真,誠實的證明者 P 能使誠實的驗證者 V 以高機率接受此命題
可靠性(Soundness):
若命題為假,則即使任何試圖欺騙的證明者 P 也不能使誠實的驗證者 V 接受此命題,除非以極低的機率
零知識性(Zero-Knowledge):
若命題為真,驗證者 V 在與證明者 P 的互動過程除了命題的真實性外,不會透漏其他訊息
- - -
三大核心特性
*前兩種特性,在廣義的互動式證明系統亦應具備。
而零知識證明不算數學證明,因為存在很低的(但非零)機率,令作弊證明者能向驗證者「證明」假命題。
該機率稱為可靠度誤差(soundness error)。換言之,零知識證明是機率「證明」,而非決定性。
不過,也有技巧將可靠度誤差壓到忽略不計。
完備性(Completeness):
驗證會成功的機率:Pr [ (P, V) (x) = 1] ≥ 1 − 𝜖,𝜖 是一個很小的常數
可靠性(Soundness):
則被誤信的機率:Pr [ (P*, V) (x) = 1] ≤ 𝛿,𝛿 是一個很小的常數
零知識性(Zero-Knowledge):
| Pr [ D ( (P, V) (x) ) = 1] − Pr [ D ( S (x) ) = 1] | ≤ 𝜖
- - -
數學式描述
*(P, V) (x) 為 證明者與驗證者針對命題 x 的互動過程(真實互動)
𝜖(epsilon)表示 很小的容許誤差(誤差上限)越小代表零知識性越強 ; epsilon 通常「小到幾乎為 0」
𝛿(delta)表示 錯誤驗證通過的風險 通常為越低越好 ; delta 在數學上常常表示為 →「微小變化」
S (x) 模擬器針對命題 x 所產生的模擬互動過程(完全不需知道秘密)
D (...) 偵測者/判別器(Distinguisher):它會試圖判斷輸入是「真實的」還是「模擬的」
P 是智者、V 是愚者、L 是所有正確答案(數獨的解答)的集合
完備性(Completeness):
智者如果真的知道解答,愚者幾乎每次都會被說服(高機率)
可靠性(Soundness):
智者如果不知道解答亂講,愚者幾乎每次都能發現錯誤(高機率)
零知識性(Zero-Knowledge):
愚者即使經歷整個過程,也學不到任何除了「答案是對的」之外的資訊
- - -
故事套用定義
A long, long time ago...
{0x03}
由三位作者於 1985 年提出一篇
《The Knowledge Complexity of Interactive Proof-Systems》
Shafi Goldwasser
Silvio Micali
Chales Rackoff
*零知識證明的交互式系統 是 ZKP 的初期發展 接著後面數年才出現 零知識證明的非交互式系統
交互式 與 非交互式
{0x04}
ZKP 可依照「是否需要多輪互動」分為兩大類:
交互式 ZKP(Interactive ZKP)
非交互式 ZKP(Non-Interactive ZKP, NIZK)
Non-interactive require only one round !!
Interactive require multiple rounds !!
交互式 與 非交互式
- - -
*所謂 Commitment (承諾)就像是「用密封信封裝好答案,之後才打開來驗證」的動作
指的是 先對某個值做出「承諾」像是秘密、答案、路徑、密碼等
公開 讓別人知道「你已經定下這個值」 之後再讓別人 驗證
具有兩個重要性質 藏匿性(Hiding)和 綁定性(Binding)
一旦提交了之後就不能更改,就像是封條不能撕開重貼
經典零知識證明範例《Where's Wally》威利在哪裡?
- - -
經典零知識證明範例《Where's Wally》威利在哪裡?
- - -
Alice
Prover
我知道在哪裡
經典零知識證明範例《Where's Wally》威利在哪裡?
- - -
Alice
Prover
經典零知識證明範例《Where's Wally》威利在哪裡?
- - -
Bob
Alice
Prover
Verifier
Prover 完成承諾後
才請 Verifier 驗證
- - -
Prover
經典零知識證明範例《Where's Wally》威利在哪裡?
Bob
Verifier
Alice
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
Point 1 : Alice 進入洞穴 而 Bob 在外等Alice 可以選擇兩條岔路 Path A or B
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
Point 1 : Alice 進入洞穴 而 Bob 在外等Alice 可以選擇兩條岔路 Path A or B
Point 2 : Alice 選擇其中一條岔路 Bob 對於 Alice 會怎麼選擇是沒有任何想法的
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
Point 1 : Alice 進入洞穴 而 Bob 在外等Alice 可以選擇兩條岔路 Path A or B
Point 2 : Alice 選擇其中一條岔路 Bob 對於 Alice 會怎麼選擇是沒有任何想法的
Point 3 : Bob 進入洞穴 並停留在岔路口
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
Point 1 : Alice 進入洞穴 而 Bob 在外等Alice 可以選擇兩條岔路 Path A or B
Point 2 : Alice 選擇其中一條岔路 Bob 對於 Alice 會怎麼選擇是沒有任何想法的
Point 3 : Bob 進入洞穴 並停留在岔路口
Point 4 : Bob 選擇一條岔路 喊給 Alice
A
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
Point 1 : Alice 進入洞穴 而 Bob 在外等Alice 可以選擇兩條岔路 Path A or B
Point 2 : Alice 選擇其中一條岔路 Bob 對於 Alice 會怎麼選擇是沒有任何想法的
Point 3 : Bob 進入洞穴 並停留在岔路口
Point 4 : Bob 選擇一條岔路 喊給 Alice
Point 5 : Alice 照 Bob 的選擇回到岔路口
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
Point 1 : Alice 進入洞穴 而 Bob 在外等Alice 可以選擇兩條岔路 Path A or B
Point 2 : Alice 選擇其中一條岔路 Bob 對於 Alice 會怎麼選擇是沒有任何想法的
Point 3 : Bob 進入洞穴 並停留在岔路口
Point 4 : Bob 選擇一條岔路 喊給 Alice
Point 5 : Alice 照 Bob 的選擇回到岔路口
B
那假設 Alice 當時選的 與 Bob 喊的不同
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
Point 1 : Alice 進入洞穴 而 Bob 在外等Alice 可以選擇兩條岔路 Path A or B
Point 2 : Alice 選擇其中一條岔路 Bob 對於 Alice 會怎麼選擇是沒有任何想法的
Point 3 : Bob 進入洞穴 並停留在岔路口
Point 4 : Bob 選擇一條岔路 喊給 Alice
Point 5 : Alice 照 Bob 的選擇回到岔路口
然而只要 Alice 知道 魔法咒語 芝麻開門
那 Alice 一樣可以透過這個 知識 往 Bob 選擇的岔路移動而回到 岔路口 證明自己知道咒語而不讓 驗證者 知道咒語
B
那假設 Alice 當時選的 與 Bob 喊的不同
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
Point 0 : Alice 和 Bob 在洞穴外相遇
Point 1 : Alice 進入洞穴 而 Bob 在外等Alice 可以選擇兩條岔路 Path A or B
Point 2 : Alice 選擇其中一條岔路 Bob 對於 Alice 會怎麼選擇是沒有任何想法的
Point 3 : Bob 進入洞穴 並停留在岔路口
Point 4 : Bob 選擇一條岔路 喊給 Alice
Point 5 : Alice 照 Bob 的選擇回到岔路口
然而只要 Alice 知道 魔法咒語 芝麻開門
那 Alice 一樣可以透過這個 知識 往 Bob 選擇的岔路移動而回到 岔路口 證明自己知道咒語而不讓 驗證者 知道咒語
那假設 Alice 當時選的 與 Bob 喊的不同
重複進行 Point 0 ~ Point 5 確保可靠性
- - -
經典零知識證明範例《The Ali Baba Cave》阿里巴巴洞穴
B
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
離散對數問題 是可以實現 交互式 ZKP 的方法之一
But, how can we achieve this ?
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
𝒙
先備知識:
對於離散對數難題 𝑦 = 𝑔 𝑚𝑜𝑑 𝑝 而言
以現今電腦來說這個 𝒙 是計算上難以反推的
𝒙
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
𝒙
𝑎
𝑎 = 𝑔 𝑚𝑜𝑑 𝑝 // r is random
r
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
𝒙
𝑎
r
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
C
驗證者 Bob 自由選擇一個挑戰值 C
𝑎 = 𝑔 𝑚𝑜𝑑 𝑝 // r is random
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
𝒙
𝑎
r
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
C
驗證者 Bob 自由選擇一個挑戰值 C
𝑤
𝑤 = C * 𝒙 + r
𝑎 = 𝑔 𝑚𝑜𝑑 𝑝 // r is random
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
𝒙
𝑎
r
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
C
驗證者 Bob 自由選擇一個挑戰值 C
𝑎 = 𝑔 𝑚𝑜𝑑 𝑝 // r is random
𝑤
𝑤 = C * 𝒙 + r
驗證者 Bob 收到 𝑤 即可進行驗證
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
𝒙
𝑎
r
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
C
驗證者 Bob 自由選擇一個挑戰值 C
𝑎 = 𝑔 𝑚𝑜𝑑 𝑝 // r is random
𝑤
𝑤 = C * 𝒙 + r
驗證者 Bob 收到 𝑤 即可進行驗證 WHY ? and HOW ?
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
𝒙
𝑎
r
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
C
驗證者 Bob 自由選擇一個挑戰值 C
𝑎 = 𝑔 𝑚𝑜𝑑 𝑝 // r is random
𝑤
𝑤 = C * 𝒙 + r
驗證者 Bob 收到 𝑤 即可進行驗證 WHY ? and HOW ?
𝑔 𝑚𝑜𝑑 𝑝 ≟
𝑦 * 𝑎 𝑚𝑜𝑑 𝑝
𝑤
C
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
𝒙
𝑎
r
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
C
驗證者 Bob 自由選擇一個挑戰值 C
𝑎 = 𝑔 𝑚𝑜𝑑 𝑝 // r is random
𝑤
𝑤 = C * 𝒙 + r
驗證者 Bob 收到 𝑤 即可進行驗證 WHY ? and HOW ?
𝑔 𝑚𝑜𝑑 𝑝 ≟
𝑦 * 𝑎 𝑚𝑜𝑑 𝑝
𝑤
C
𝑔 𝑚𝑜𝑑 𝑝 ≟ (
𝑔)
* 𝑔 𝑚𝑜𝑑 𝑝
(C * 𝒙 + r)
C
𝒙
r
- - -
用數學與密碼學的視角學習交互式 ZKP(by 離散對數
Prover
Bob
Verifier
Alice
若今天 Alice 知道一個秘密數字... 𝒙
𝒙
𝑎
r
Prepare Public (key) : 𝑝 , 𝑔 𝑎𝑛𝑑 𝑦
𝑝 𝑖𝑠 𝑎 𝑝𝑟𝑖𝑚𝑒
𝑦 = 𝑔 𝑚𝑜𝑑 𝑝
C
驗證者 Bob 自由選擇一個挑戰值 C
𝑎 = 𝑔 𝑚𝑜𝑑 𝑝 // r is random
𝑤
𝑤 = C * 𝒙 + r
驗證者 Bob 收到 𝑤 即可進行驗證 WHY ? and HOW ?
𝑔 𝑚𝑜𝑑 𝑝 ≟
𝑦 * 𝑎 𝑚𝑜𝑑 𝑝
𝑤
C
𝑔 𝑚𝑜𝑑 𝑝 ≟ (
𝑔)
* 𝑔 𝑚𝑜𝑑 𝑝
(C * 𝒙 + r)
C
𝒙
r
先備知識:
𝑤 需要模 (𝑝-
1) 因為費馬小定理 才能使後面的 𝑔 等效 𝑔
𝑚𝑜𝑑 (𝑝-
1)
𝑤
(C * 𝒙 + r)
From AIS3 2024 Pre-Exam CTF
{0x05}
這題 zkp CTF 挑戰 來自 AIS3 2024 Pre-Exam CTF
是一道需要 Netcat 的題目
有附上檔案可以下載,打開來是 Source Code
#!/bin/python3
import random
from secret import flag
from Crypto.Util.number import bytes_to_long, getPrime, isPrime
import signal
def alarm(second):
# This is just for timeout.
# It should not do anything else with the challenge.
def handler(signum, frame):
print('Timeout!')
exit()
signal.signal(signal.SIGALRM, handler)
signal.alarm(second)
def gen_prime(n):
while True:
p = 1
while p < (1 << (n - 1)) :
p *= getPrime(5)
p = p * 2 + 1
if isPrime(p): break
return p
def zkp_protocol(p, g, sk):
# y = pow(g, sk, p)
r = random.randrange(p-1)
a = pow(g, r, p)
print(f'a = {a}')
print('Give me the challenge')
try:
c = int(input('c = '))
w = (c * sk + r) % (p-1)
print(f'w = {w}')
# you can verify I know the flag with
# g^w (mod p) = (g^flag)^c * g^r (mod p) = y^c * a (mod p)
except:
print('Invalid input.')
if __name__ == "__main__":
alarm(300)
assert len(flag) == 60
p = 912963562570713895762123712634341582363191342435924527885311975797578046400116904692505817547350929619596093083745446525856149291591598712142696114753807416455553636357128701771057485027781550780145668058332461392878693207262984011086549089459904749465167095482671894984474035487400352761994560452501497000487
# p is generated by gen_prime(1024)
g = 5
y = pow(g, bytes_to_long(flag), p)
print("""
******************************************************
Have you heard of Zero Knowledge Proof? I cannot give
you the flag, but I want to show you I know the flag.
So, let me show you with ZKP.
------------------------------------------------------
1) Printe public key.
2) Run ZKP protocol.
3) Bye~
******************************************************
""")
for _ in range(3):
try:
option = input("Option: ")
if int(option) == 1:
print('My public key:')
print(f'p = {p}')
print(f'g = {g}')
print(f'y = {y}')
elif int(option) == 2:
zkp_protocol(p, g, bytes_to_long(flag))
else:
print("Bye~~~~~")
break
except:
print("Something wrong?")
exit()
# PRESENTING CODE
⚔️ What?! Smooth attack detected?! Quick, hide the private keys! 🛡️
{0x06}
若一個質數很 Smooth 的話 會發生... ?
若一個質數很 Smooth 的話 會發生... ?
factordb 技術
Pollard's p-1
Sage
Pollard–Hellman algorithm
Chinese Remainder Theorem
You Can Dowload Sage from Here : https://www.sagemath.org/
# Solve.Sage
from Crypto.Util.number import long_to_bytes
p = 912963562570713895762123712634341582363191342435924527885311975797578046400116904692505817547350929619596093083745446525856149291591598712142696114753807416455553636357128701771057485027781550780145668058332461392878693207262984011086549089459904749465167095482671894984474035487400352761994560452501497000487
g = 5
y = 826538666839613533825164219540577914201103248283631882579415248247469603672292332561005185045449294103457059566058782307774879654805356212117148864755019033392691510181464751398765490686084806155442759849410837406192708511190585484331707794669398717997173649869228717077858848442336016926370038781486833717341
F = GF(p)
x = discrete_log(F(y), F(g))
x
long_to_bytes(x)
# PRESENTING CODE
除了... 還可以...
{0x07}
Decentralized ID (DID, 去中心化身份)
| Web 3.0, a decentralized and fair internet where users control their own data, identity and destiny.
它是一種讓使用者可以在網路上自主識別和管理自己身份的系統
會出現的背景是因為現有 Web2 中人們的身份已經被各種中心化的大型公司和政府掌握
例如當 Facebook, Twitter 等社群平台決定將某個用戶的帳號停權時
他們的網路足跡就會直接被消失
因此 DID 主要目的是希望將個人資料與身份的控制權交還給使用者本人
這樣每個人的身份就不再依賴於傳統的中心化身份提供者
驗證身份 資訊而不洩漏 細節,保障隱私且提升安全性,適用於身份驗證與資料共享
快速回顧
{0x08}
By heymrsalt
A beginner-friendly introduction to Zero-Knowledge Proof (ZKP) — Covering both interactive and non-interactive models. Includes CTF challenges 🚩 for hands-on learning and understanding.