ถอดรหัสลับ RSA: ไขความลับเมื่อกุญแจส่วนหนึ่งซ้ำกัน

ถอดรหัสลับ 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) ชุดเดียวกัน และ ข้อความ ที่เข้ารหัสแตกต่างกัน หรือใช้มาตรการป้องกันเพิ่มเติม

การทำความเข้าใจช่องโหว่เช่นนี้เป็นสิ่งสำคัญสำหรับนักพัฒนาและผู้ดูแลระบบทุกคน เพื่อสร้างระบบที่ปลอดภัยอย่างแท้จริง