Diffie-Hellman กับการสร้าง Shared-Secret Key
ในปัจจุบันเทคโนโลยีการเข้ารหัสข้อมูลเป็นสิ่งที่อยู่รอบตัวเราในทุกวัน ตั้งแต่การเข้าถึง website ด้วย HTTPS ไปจนถึงการใช้ SSH สำหรับการทำ remote access โดยการเข้ารหัสข้อมูลระหว่าง Client และ Server เป็นรูปแบบการใช้งานที่เห็นได้ทั่วไปมากที่สุด แต่ว่าในการเข้ารหัสข้อมูลโดยการใช้ Symmetric Encryption หรือว่าการเข้ารหัสแบบกุญแจสมมาตร ทั้งฝั่งผู้ส่งและผู้รับ จำเป็นจะต้องมีกุญแจที่เอาไว้ใช้เข้ารหัสและถอดรหัส โดยกุญแจในการเข้ารหัสและถอดรหัสก็ควรจะเป็นความลับ เพราะถ้าหากว่ากุญแจชุดนี้ได้หลุดออกไปสู่สาธารณะ ผู้อื่นก็จะสามารถใช้กุญแจนั้นเพื่อถอดรหัสสิ่งที่ผู้ส่งและผู้รับสื่อสารกันได้
Diffie–Hellman เป็นวิธีหนึ่งที่จะทำให้ผู้ส่งและผู้รับสาร สามารถที่จะสร้างและส่ง Shared-Secret หรือกุญแจในการเข้ารหัสและถอดรหัส ให้แก่กันได้ในสภาพแวดล้อมที่เป็นสาธารณะ
หลักการทำงานของ Diffie–Hellman คือการใช้สมบัติของ Modulo ดังนี้
$$ (g^{a} \bmod{p})^{b} \bmod{p} = g^{ab} \bmod{p}$$
$$(g^{b} \bmod{p})^{a} \bmod{p} = g^{ba} \bmod{p}$$
จะเห็นได้ว่า ไม่ว่าเราจะนำ g มายกกำลังด้วย a หรือ b ก่อนที่จะยกกำลังด้วย a หรือ b อีกที ผลที่ได้ก็ยังคงเป็น \( g^{ab} \bmod{p}\) เหมือนเดิม
วิธีการทำงานของ Diffie-Hellman
- Alice และ Bob เลือกเลขจำนวนเฉพาะ g และ p โดยทั้งคู่จะใช้ g และ p เป็นค่าเดียวกัน โดยค่าทั้งสองตัวนี้สามารถส่งผ่าน public ได้ โดยปกติแล้ว p จะใหญ่กว่า g มากเพื่อความปลอดภัย
2. Alice และ Bob เลือกเลขขึ้นมา คนละ 1 เลข โดยเก็บไว้เป็นความลับ
3. Alice ทำการคำนวณหา \( g^{a} \bmod{p}\) และส่งค่านั้นให้กับ Bob ผ่านตัวกลางที่เป็น public โดย Bob ก็จะคำนวณ \( g^{b} \bmod{p}\) และส่งค่านั้นให้กับ Alice ด้วยเช่นกัน
4. Alice นำค่าที่ได้รับมาจาก Bob มายกกำลังด้วย a และ mod ด้วย p และ Bob ก็นำค่าที่ได้รับมาจาก Alice มายกกำลังด้วย b และ mod ด้วย p เช่นกัน
ดังนั้นค่าที่ Alice ได้หลังจากคำนวณคือ $$(g^{a} \bmod{p})^{b} \bmod{p}$$ และ ค่าที่ Bob ได้ก็คือ $$(g^{b} \bmod{p})^{a} \bmod{p}$$
จากสมบัติของ Modulo ที่ได้กล่าวไว้ตอนต้น ค่าที่ Alice และ Bob ได้ก็คือ $$g^{ab} \bmod{p}$$ ซึ่งเป็นค่าเดียวกันทั้งสองฝั่ง ดังนั้นค่า \( g^{ab} \bmod{p}\) ที่ทั้ง Alice และ Bob มีเหมือนกัน ก็จะถูกใช้เป็น Shared-Secret หรือกุญแจในการเข้ารหัสและถอดรหัสในการสื่อสารต่อไป
ในปัจจุบัน การสร้าง Shared-Secret ไม่สามรถทำโดยการใช้ Diffie-Hellman อย่างเดียวได้ เนื่องจาก Diffie-Hellman สามารถที่จะถูกการโจมตีแบบ Man-in-the-Middle ได้ ดังนั้นฝั่งผู้ส่งและผู้รับต้องการวิธีอื่น เพื่อที่จะยืนยันตัวตนของทั้งคู่ว่า เรากำลังคุยอยู่กับคนที่เราต้องการจะคุยด้วยจริงๆ ตัวอย่างเช่นการใช้ Public-Private Key สำหรับ Webserver ในระบบ HTTPS ที่ช่วยทำการตรวจสอบว่า Webserver นั้นเป็น Webserver ที่ถูกต้องตาม Certificate หรือไม่ ถ้าหากถูกต้องก็จะใช้ Diffie-Hellman เพื่อการสร้าง Shared-Secret ต่อไป