
ถอดรหัสลับ RSA: ไขความลับเมื่อกุญแจส่วนหนึ่งซ้ำกัน
RSA เป็นหนึ่งในระบบการเข้ารหัสแบบ กุญแจสาธารณะ ที่ได้รับความนิยมและเชื่อถือได้มากที่สุด หัวใจสำคัญคือการใช้กุญแจคู่หนึ่งคือกุญแจสาธารณะสำหรับเข้ารหัสและกุญแจส่วนตัวสำหรับถอดรหัส
อย่างไรก็ตาม แม้แต่ระบบที่แข็งแกร่งอย่าง RSA ก็ยังมี ช่องโหว่ ซ่อนอยู่ หากการนำไปใช้งานไม่ได้คำนึงถึงเงื่อนไขบางอย่างให้ดี หนึ่งในสถานการณ์ที่น่าสนใจและอาจนำไปสู่การ ถอดรหัส ได้คือเมื่อมีการใช้ Modulus (n) ร่วมกัน
RSA ทำงานอย่างไรในมุมง่ายๆ
ลองนึกภาพว่า RSA เปรียบเสมือนตู้เซฟที่มีกุญแจสองดอก กุญแจดอกหนึ่งแจกจ่ายให้ทุกคนใช้ล็อกตู้ (กุญแจสาธารณะ e และ n) อีกดอกหนึ่งเก็บไว้กับเจ้าของเท่านั้นเพื่อใช้เปิดตู้ (กุญแจส่วนตัว d และ n)
เมื่อต้องการส่ง ข้อความลับ ข้อความนั้นจะถูกแปลงเป็นตัวเลข แล้วนำไปยกกำลังด้วยกุญแจสาธารณะ e และหาเศษเหลือจากการหารด้วย n ผลลัพธ์ที่ได้คือ ข้อความเข้ารหัส (ciphertext)
เมื่อผู้รับได้ข้อความเข้ารหัสมา ก็จะนำไปยกกำลังด้วยกุญแจส่วนตัว d แล้วหาเศษเหลือจากการหารด้วย n อีกครั้ง เพื่อแปลงกลับมาเป็น ข้อความต้นฉบับ (plaintext) อีกครั้ง
ความปลอดภัยของ RSA ขึ้นอยู่กับความยากในการแยกตัวประกอบของ n ซึ่งเป็นผลคูณของจำนวนเฉพาะขนาดใหญ่สองตัว
ความเสี่ยงของ RSA เมื่อ Modulus (n) ซ้ำกัน
ในทางปฏิบัติ การใช้ Modulus (n) เดียวกันสำหรับข้อความหลายชุด หรือสำหรับผู้ใช้งานหลายคน มักถูกมองว่าเป็นเรื่องปกติเพื่อความสะดวก หรือเพื่อลดภาระการคำนวณ
แต่ในสถานการณ์ที่เฉพาะเจาะจง นี่อาจกลายเป็นจุดอ่อนร้ายแรงได้
ลองจินตนาการว่ามี ข้อความลับ เดียวกันถูกเข้ารหัสสองครั้ง โดยใช้ Modulus (n) ตัวเดียวกัน แต่ใช้ Public Exponent (e) ที่แตกต่างกันสองตัว เช่น $e1$ และ $e2$
ดังนั้น เราจะมีข้อความเข้ารหัสสองชุด:
- $c1 = m^{e1} \pmod n$
- $c2 = m^{e2} \pmod n$
ทำไมถึงอันตรายและถอดรหัสได้?
ถ้า $e1$ และ $e2$ เป็น จำนวนเฉพาะสัมพัทธ์ (coprime) นั่นคือไม่มีตัวประกอบร่วมกันนอกจาก 1 (หรือที่เรียกว่า $\gcd(e1, e2) = 1$) สถานการณ์นี้จะเปิดช่องให้ผู้ไม่หวังดีสามารถกู้คืน ข้อความต้นฉบับ (m) ได้โดยไม่ต้องรู้ กุญแจส่วนตัว (d) เลย
นี่คือหลักการง่ายๆ ที่ทำให้มันเป็นไปได้:
เนื่องจาก $e1$ และ $e2$ เป็นจำนวนเฉพาะสัมพัทธ์ เราสามารถใช้ Extended Euclidean Algorithm เพื่อหาจำนวนเต็ม $x$ และ $y$ ที่ทำให้สมการ $x \cdot e1 + y \cdot e2 = 1$ เป็นจริงได้
เมื่อเราได้ค่า $x$ และ $y$ แล้ว เราสามารถนำมาใช้กับข้อความเข้ารหัสได้ดังนี้:
$m^1 \equiv m^{(x \cdot e1 + y \cdot e2)} \pmod n$
$m \equiv (m^{e1})^x \cdot (m^{e2})^y \pmod n$
และเนื่องจากเรารู้ว่า $c1 = m^{e1} \pmod n$ และ $c2 = m^{e2} \pmod n$ เราจึงสามารถแทนค่าได้เป็น:
$m \equiv c1^x \cdot c2^y \pmod n$
ด้วยวิธีนี้ ผู้โจมตีที่เข้าถึง $c1$, $c2$, $e1$, $e2$ และ $n$ ก็จะสามารถถอดรหัสหา $m$ ได้ทันที
บทเรียนสำคัญสำหรับการเข้ารหัส RSA
ช่องโหว่นี้เน้นย้ำถึงความสำคัญของการพิจารณาปัจจัยหลายอย่างในการออกแบบและใช้งานระบบ เข้ารหัส RSA
แม้ว่า RSA จะแข็งแกร่งในตัวของมันเอง แต่การนำไปใช้โดยไม่ระมัดระวัง เช่น การใช้ Modulus (n) ซ้ำกันกับ Public Exponent (e) ที่แตกต่างกันสำหรับข้อความเดียวกัน ก็อาจสร้างประตูหลังให้ผู้ไม่หวังดีเข้าถึงข้อมูลได้ง่ายดาย
ดังนั้น เพื่อความปลอดภัยสูงสุด จึงควรหลีกเลี่ยงการใช้ Modulus (n) เดียวกันซ้ำๆ หรือหากจำเป็นต้องใช้ ควรแน่ใจว่าได้ใช้ Public Exponent (e) ชุดเดียวกัน และ ข้อความ ที่เข้ารหัสแตกต่างกัน หรือใช้มาตรการป้องกันเพิ่มเติม
การทำความเข้าใจช่องโหว่เช่นนี้เป็นสิ่งสำคัญสำหรับนักพัฒนาและผู้ดูแลระบบทุกคน เพื่อสร้างระบบที่ปลอดภัยอย่างแท้จริง