[Cybersecurity] ว่าด้วยเรื่องโหมดของ Advanced Encryption Standard (AES)

Thanwa Jindarattana
3 min readOct 25, 2020

--

อารัมภบท
ก่อนหน้าที่จะมี AES เรามีมาตรฐานที่ชื่อว่า Data Encryption Standard หรือ DES มาก่อน ซึ่งถูกพัฒนามาตั้งแต่ปี 1970 ที่ IBM ซึ่งในขณะนั้นการพัฒนา DES ตั้งอยู่บนสมมติฐานที่ว่า computation power ในช่วงนั้นไม่มีความสามารถพอที่จะ break ตัว DES

หลังจากนั้นก็มีการแก้ปัญหาทางด้านความปลอดภัยด้วยการทำ DES ซ้อนกันหลาย ๆ ชั้น เช่น Double DES แต่ก็จะเจอปัญหา meet-on-the-middle attack (ซึ่งจะไม่อธิบายในบทความนี้) ทำให้ต้องเพิ่มการทำ DES ไปเรื่อย ๆ เช่น Tripple DES หรือ Quadruple DES ไปเรื่อย ๆ (ซึ่งไม่ค่อยดีนักในระยะยาว)

ปี 1998 เลยมีการพัฒนามาตรฐานใหม่ชื่อว่า Advanced Encryption Standard หรือ AES ซึ่งถูกคิดค้นโดย Rijndael โดยมีความรวดเร็วกว่าเพราะมี overhead ในการเข้ารหัสและถอดรหัสน้อย และต่อมาได้บรรจุอยู่ใน National Institute of Standards and Technology (NIST) ในปี 2001

สาเหตุที่ overhead น้อยเพราะมาตรฐาน AES จะใช้แค่ opertion ง่าย ๆ เช่นการ XOR, sub byte, shift row ซึ่งไม่เกี่ยวกับ prime factors หรือพวกจำนวนเฉพาะเลย ศัพท์เฉพาะในการทำเช่นนี้จะเรียกว่า Substitution–permutation network

Substitution–permutation network

เนื่องจากการเข้ารหัสแบบ AES เป็นการเข้ารหัสแบบ block cipher ซึ่งหมายความว่าถ้าเราต้องการเข้ารหัสข้อมูลใด ๆ ขนาดของกุญแจจะต้องสัมพันธ์กับขนาดของข้อมูล แล้วถ้าสมมติว่าเราต้องเข้ารหัสไฟล์ที่มีขนาด 1GB เราต้องมีกุญแจสำหรับเข้ารหัสใหญ่ 1GB ด้วยหรือไม่?

คำตอบก็คือไม่ใช่ เพราะ AES มีโหมดให้เลือกในการเข้ารหัสอยู่หลายแบบ ซึ่งวันนี้เราจะยกตัวอย่างแค่ 3 โหมด เรามาไล่ดูแต่ละแบบกัน

1. Electronic Codebook (ECB)
การเข้ารหัสแบบ ECB เป็นวิธีแบบพื้นฐาน ซึ่งวิธีก็คือต้องเอาขนาดของข้อมูลที่เราจะเข้ารหัสมาหารด้วยขนาดของกุญแจ ซึ่งจะได้ข้อมูลออกมาเป็นก้อน ๆ (ขอเรียกว่า chunk) แล้วเอาแต่ละ chunk มาเข้ารหัส ซึ่งก็เป็นวิธีที่ตรงไปตรงมา

แต่ข้อเสียของวิธี ECB คือ ciphertext มันยังคงร่องรอยของ paintext เอาไว้ตาม pattern ของ key ที่ใส่เข้าในฟังก์ชัน เช่นถ้ามีส่วนหนึ่งของ plaintext ที่ซ้ำกัน การเข้ารหัสก็จะได้ ciphertext ที่เหมือนกัน บางคนอาจจะนึกภาพไม่ออก งั้นขอแสดงเป็นรูปภาพจะได้ดังนี้

จะเห็นว่ารูปรูปซ้าย (plaintext) จะยังส่งผลต่อรูปขวา (ciphertext) อยู่ซึ่งถือว่าข้อมูลมีการรั่วไหล

นอกจากนี้แล้ว ECB ยังมีข้อเสียอีกอย่างคือสามารถโจมตีด้วยวิธี cut-and-paste ได้โดยการสลับ chunk กัน เช่น

Alice digs Bob. Trudy digs Tom. จะได้ chunk C0, C1, C2, C3, C4, C5 แต่ปรากฎว่ามี Eve คอยดักฟังและสลับที่ Chunk เป็น C0, C1, C5, C3, C4, C2 กลายเป็น Alice digs Tom. Trudy digs Bob. เป็นต้น ซึ่งทำให้สูญเสียความบริสุทธิ์ผุดผ่องของข้อมูลหรือที่เราเรียกกันว่า integrity ได้

2. Cipher Block Chaining (CBC)
CBC ได้แก้ไขปัญหาการรั่วไหลจาก plaintext ไปยัง ciphertext โดยการเพิ่ม Initialization Vector (IV) ซึ่งเป็น pseudorandom number ที่ไม่จำเป็นต้องเก็บเป็นความลับ

ผลลัพธ์ของ CBC

จะเห็นได้ว่าในการเข้ารหัส chunk แรก จะต้องใช้ IV เป็นส่วนประกอบในการเข้ารหัส ส่วนใน chunk ต่อไป จะใช้ผลลัพธ์ของ ciphertext ก่อนหน้ามาเป็นส่วนประกอบในการเข้ารหัส chuck ปัจจุบัน

หลายคนคงมองเห็นปัญหาของ CBC แล้วว่าการกระทำแบบนี้เป็นแบบ sequential กล่าวคือต้องรอผลลัพธ์ของ chunk ก่อนหน้าถึงจะเริ่มเข้ารหัส chunk ปัจจุบันได้ซึ่งเป็นแนวคิดที่ไม่ค่อยดีนักในยุคที่เราใช้งานคอมพิวเตอร์แบบ multi-core

3. Counter Mode (CTR)
วิธีนี้เป็นวิธีที่แก้ปัญหาจากแบบที่ 2 ที่ติดปัญหา dependency โดยการเพิ่ม counter ให้แต่ละ chunk

จำกันได้ใช่ไหมว่าการเพิ่มตัวเลขแค่เพียงเล็กน้อย (การบวก 1 ไปเรื่อย ๆ) มันจะส่งผลทำให้ผลลัพธ์ที่ได้จากฟังก์ชัน encryption เปลี่ยนแปลงมหาศาล ซึ่งเราสามารถใช้ประโยชน์ของคุณสมบัตินี้ได้

แน่นอนว่าหากเราออกแบบการเข้ารหัสและถอดรหัสตามแนวทาง CTR เราสามารถที่จะประมวณผลแบบขนานได้ซึ่งมีประสิทธิภาพมากกว่า

เปรียบเทียบทั้ง 3 โหมด

ครั้งหน้าเราจะมาเรียนรู้เรื่อง stream cipher ที่เปลี่ยนจากเข้ารหัสทีละ block เป็นเข้ารหัสทีละไบต์กันว่าทำกันอย่างไร สำหรับวันนี้ขอจบการเขียนบทความเพียงเท่านี้ หากมีข้อผิดพลาดประการใดรบกวนแจ้งในคอมเมนต์ได้เลยครับ

เนื้อหาดัดแปลงมาจาก:
D. Wagner, University of California, Berkeley
M. Stamp, San Jose State University
R. Paruj, Kasetsart University

--

--