Skip to content

ปริศนา time-lock แบบ RSW

Cap รุ่นใหม่ ๆ เพิ่ม challenge ชนิดทดลองที่เรียกว่า ปริศนา time-lock แบบ RSW (Rivest-Shamir-Wagner) ซึ่งมีไว้เป็นทางเลือกที่ต้านทาน GPU ได้ดีกว่า proof-of-work แบบ SHA-256 ที่เป็นค่าเริ่มต้น

TIP

RSW เป็นแบบ เลือกเปิดเอง ไปป์ไลน์มาตรฐานของ Cap ยังคงใช้ PoW แบบ SHA-256 วิดเจ็ตและเซิร์ฟเวอร์ที่มีอยู่จะไม่เปลี่ยนพฤติกรรม เว้นแต่คุณจะเปิดใช้อย่างชัดเจน

ทำไมต้อง RSW

PoW แบบ SHA-256 ที่เป็นค่าเริ่มต้นของ Cap นั้นเร็วและตรวจสอบได้ถูก แต่ในทางทฤษฎีปริศนาแต่ละข้อสามารถถูกเร่งด้วย GPU หรือ ASIC ได้ เรายังไม่เคยเห็นกรณีจริงในสนาม แต่เมื่อ GPU ถูกลงและหาง่ายขึ้น ระยะปลอดภัยของ PoW ที่อิงกับแฮชก็ค่อย ๆ หดลง

RSW เป็นปริศนาที่ต้องทำตามลำดับ ออกแบบมาให้ต้านทานการเร่งด้วย GPU ตอนนี้เรายังทดสอบและวัดผลอยู่ก่อนจะพร้อมใช้งานจริง แต่ผลลัพธ์จนถึงตอนนี้ค่อนข้างน่าพอใจ

อันที่จริงจากการทดสอบของเรา RSW ทำงาน ช้ากว่า บน A100 เมื่อเทียบกับโทรศัพท์รุ่นใหม่อย่าง iPhone Air เราวัดผลบน GPU ที่เช่ามาไม่กี่ตัว (ด้วยไลบรารี CGBN ของ NVIDIA เอง) และบนอุปกรณ์ผู้ใช้ทั่วไป:

ฮาร์ดแวร์µs ต่อการยกกำลังสองขนาด 2048 บิต (สายเดียว)
Apple M3 Air, Chrome 1482.39
Apple iPhone Air, iOS 26 + Chrome3.07
Pixel 9, Chrome 1455.14
iPhone 12, iOS 17 (WebKit)8.57
NVIDIA H100, 32 เธรดช่วยกันในสายเดียว2.70
NVIDIA L4, 32 เธรดช่วยกัน2.69
NVIDIA A100, 32 เธรดช่วยกัน4.82

โปรโตคอลทำงานอย่างไร

การตั้งค่า (ทำครั้งเดียวตอนบูต)

เซิร์ฟเวอร์สร้างมอดุลัสแบบ RSA ขนาด 2048 บิต N = p·q โดยเก็บ p และ q เป็นความลับ และเผยแพร่เฉพาะ N การสร้างคู่กุญแจใช้เวลาราว 0.5–3 วินาที ขึ้นกับดวงในการสุ่มจำนวนเฉพาะ เซิร์ฟเวอร์จึงควรบันทึกผลลัพธ์ไว้และนำกลับมาใช้ข้ามโพรเซส

การสร้าง challenge แต่ละข้อ (≈ 2 มิลลิวินาที)

ถ้าคิดแบบตรงไปตรงมา การสร้าง challenge จะบังคับให้เซิร์ฟเวอร์คำนวณ y = x^(2^t) mod N ตั้งแต่ต้น ซึ่งก็คืองานหนักชุดเดียวกับที่ไคลเอนต์ทำ เราเลี่ยงเรื่องนี้ด้วยเทคนิคเลขชี้กำลังสั้น:

  1. ตอนตั้งค่า เซิร์ฟเวอร์คำนวณ h = g^(2^t) mod N ล่วงหน้าเพียงครั้งเดียว โดยใช้ประตูลับ φ(N) = (p-1)(q-1) นี่คือ modexp เต็มกำลัง ครั้งเดียว
  2. สำหรับ challenge แต่ละข้อ เซิร์ฟเวอร์สุ่มสเกลาร์ขนาด 256 บิต r แล้วคำนวณ:
    • x = g^r mod N
    • y = h^r mod N
  3. ในทางพีชคณิต x^(2^t) = (g^r)^(2^t) = (g^(2^t))^r = h^r = y

ทั้ง g^r และ h^r เป็น modexp ที่มีเลขชี้กำลัง 256 บิต ใช้การคูณสั้น ๆ ราว 4 ครั้งต่ออัน เมื่อเร่งด้วยทฤษฎีบทเศษเหลือของจีนบน p และ q การสร้างทั้งหมดใช้เวลาราว 2 มิลลิวินาทีบน CPU สมัยใหม่

ไคลเอนต์เห็นแค่ (N, x, t) การย้อนหา r จาก x คือปัญหาลอการิทึมไม่ต่อเนื่องใน (Z/N)* ซึ่งยากพอ ๆ กับการแยกตัวประกอบ N เลขชี้กำลัง 256 บิตก็ไม่ได้เปิดทางลัดใด ๆ (ยังไม่มีการโจมตีแบบ sub-exponential ที่รู้จักต่อ DLP ในกลุ่มย่อยที่มีมอดุลัส 2048 บิตและเลขชี้กำลังสั้น)

การแก้ฝั่งไคลเอนต์

สิ่งเดียวที่ไคลเอนต์ต้องทำเมื่อได้ (N, x, t) คือคำนวณ:

js
let y = x;
for (let i = 0; i < t; i++) y = (y * y) % N;

บนฮาร์ดแวร์ส่วนใหญ่ใช้เวลาราว 300–800 มิลลิวินาที

การตรวจสอบฝั่งเซิร์ฟเวอร์ (≈ 100 ไมโครวินาที)

token สถานะที่เข้ารหัสไว้ของเซิร์ฟเวอร์มีค่า y ที่คาดหวังอยู่แล้ว (ใส่ไว้ตั้งแต่ตอนสร้าง challenge) การตรวจสอบจึงเป็นแค่การเทียบ BigInt แบบเวลาคงที่กับ y ที่ส่งมา ไม่ต้องคำนวณซ้ำ

สิ่งที่ RSW ไม่ ได้ป้องกัน

RSW ไม่ได้ป้องกันฮาร์ดแวร์แบบ FPGA หรือ ASIC ชิปเฉพาะทางยกกำลังสองแบบมอดุลาร์ขนาด 2048 บิตได้ใน 50–100 นาโนวินาทีบน FPGA (เร็วกว่าคอร์ CPU ราว 15–20 เท่า) และในระดับหน่วยนาโนวินาทีบน ASIC (ราว 200–300 เท่า) ในเชิงเศรษฐศาสตร์มันยังไม่คุ้มสำหรับการทำฟาร์ม CAPTCHA เพราะ ASIC เฉพาะทางมีต้นทุนออกแบบหลายล้าน แต่ถ้าโมเดลภัยคุกคามของคุณรวมผู้โจมตีระดับรัฐด้วย คุณก็คงหนักอยู่ดี

ลองใช้งาน

API ของ cap-core สำหรับ RSW มีเอกสารอยู่ที่ challenge แบบ RSW ตัววิดเจ็ตตรวจจับการตอบกลับแบบ format 2 ได้เอง เพียงอัปเกรดไบนารีตัวเดิมบนเซิร์ฟเวอร์ก็พอ

ถ้าคุณใช้ Cap Standalone ตัวเลือก RSW จะอยู่ในแดชบอร์ดเป็นสวิตช์รายคีย์ ดูรายละเอียดได้ที่หน้าตัวเลือกของ Standalone

เผยแพร่ภายใต้สัญญาอนุญาต Apache 2.0