ถ้ำ Ali Baba — พิสูจน์ว่ารู้คาถา โดยไม่บอกคาถา
ผู้พิสูจน์เดินเข้าถ้ำทางซ้ายหรือขวาตามใจชอบ แล้วผู้ตรวจ (ยืนอยู่หน้าปากถ้ำ) สุ่มตะโกนว่า "ออกมาทางซ้าย/ขวา!" ใครรู้คาถาจะลอดประตูวิเศษข้างในแล้วออกทางที่ถูกเรียกได้เสมอ ส่วนคนโกง (ไม่รู้คาถา) จะออกทางที่ถูกเรียกได้แค่ตอนที่ "เข้าถูกทาง" เอง — โอกาส 50% ต่อรอบ ยิ่งเล่นหลายรอบ คนโกงยิ่งโดนจับ (โอกาสรอดครบ N รอบ = 1/2N)
รอบทั้งหมด: 0
ผ่าน: 0
โดนจับ: 0
ถ้าเป็น "คนโกง" โอกาสหลอกผ่านครบทุกรอบที่เล่นมา = —
Schnorr identification — ZKP แบบที่ใช้จริงในงานคริปโต
ผู้พิสูจน์มีความลับ x และเผยแพร่ค่าสาธารณะ y = gˣ mod p
จากนั้นพิสูจน์ให้ใครก็ได้เชื่อว่ารู้ x — โดย x ไม่เคยถูกส่งออกไปเลย
(ใครอยากหา x จาก y ต้องแก้ discrete logarithm ซึ่งคำนวณไม่ไหม้) ทุกตัวเลขด้านล่างคำนวณจริงด้วย JavaScript ในหน้านี้
ขั้น 1 · เตรียมความลับ
สุ่มความลับ x (256 บิต) แล้วคำนวณ y = gx mod p — เผยแพร่ได้แค่ y เท่านั้น (g = 2, p = จำนวนเฉพาะ 256 บิต, q = p−1)
x = — [แอบดู x — ในโปรโตคอลจริงทำไม่ได้!]
y = gˣ mod p = —
ขั้น 2 · ผู้พิสูจน์ "คอมมิต"
สุ่ม r (nonce, ใช้ครั้งเดียวทิ้ง) แล้วส่ง t = gr mod p ให้ผู้ตรวจ — จุดสำคัญ: ต้องคอมมิตก่อนเห็นคำท้าทาย
r = —
t = gʳ mod p = —
ขั้น 3 · ผู้ตรวจสุ่ม "คำท้าทาย"
สุ่ม c (128 บิต) — ความสุ่มของผู้ตรวจนี่แหละที่บังคับให้ผู้พิสูจน์ต้องมี x จริง
c = —
ขั้น 4 · ผู้พิสูจน์ "ตอบ"
คำนวณ s = (r + c·x) mod (p−1) — สังเกตว่าใน s มีทั้งความลับ x ปนอยู่ แต่กลับ "หัก r ออก" พอดี ทำให้เปิดเผยอะไรไม่ได้
s = —
ขั้น 5 · ผู้ตรวจตรวจสอบ
ตรวจว่า
gˢ ≟ t · yᶜ (mod p) — ถ้า s คำนวณจาก x จริง สมการจะออกมาเท่ากันเสมอ โดยไม่ต้องรู้ x เลยฝั่งซ้าย gˢ mod p = —
ฝั่งขวา t·yᶜ mod p = —
ยืนยันสำเร็จ 0 รอบ · ล้มเหลว 0 รอบ