การเข้ารหัส AES
AES เป็นอัลกอริธึมการเข้ารหัส ได้รับการคัดเลือกโดยรัฐบาลสหรัฐฯ ในปี 2544 หลังจากการแข่งขันแบบเปิดที่กินเวลานานหลายปี โปรแกรมนี้ถือเป็นผลงานด้านการเข้ารหัสสำหรับยุคอินเทอร์เน็ตสมัยใหม่ทั้งหมด TLS, WireGuard, BitLocker, FileVault, การเข้ารหัสพื้นที่เก็บข้อมูลในโทรศัพท์ของคุณ — ทั้งหมดนี้เป็น AES
เนื้อหาบทความฉบับเต็มมีให้เป็นภาษาอังกฤษด้านล่าง
AES (Advanced Encryption Standard) เป็นบล็อกรหัสแบบสมมาตรที่ NIST เลือกไว้ในปี 2544 หลังจากการแข่งขันเปิดนานห้าปีซึ่งมีการออกแบบสิบห้าแบบมาแข่งขันกัน ผู้ชนะ — เดิมชื่อ Rijndael ซึ่งออกแบบโดยนักเข้ารหัสชาวเบลเยียม Joan Daemen และ Vincent Rijmen — กลายเป็นมาตรฐานการเข้ารหัสสำหรับข้อมูลรัฐบาลกลางของสหรัฐอเมริกา และเป็นค่าเริ่มต้นอย่างรวดเร็วสำหรับระบบเชิงพาณิชย์เกือบทุกระบบ
"การเข้ารหัสบล็อกแบบสมมาตร" หมายถึงอะไร
Symmetric: ซึ่งเป็นคีย์เดียวกันที่เข้ารหัสและถอดรหัส เปรียบเทียบกับการเข้ารหัสคีย์สาธารณะ (RSA, ECDH) ซึ่งมีคีย์แยกกันสำหรับแต่ละทิศทาง
Block cipher: เข้ารหัสชิ้นส่วนข้อมูลขนาดคงที่ในแต่ละครั้ง AES ใช้ขนาดบล็อก 128 บิต (16 ไบต์) โดยไม่คำนึงถึงขนาดคีย์
ข้อความธรรมดาจะถูกแบ่งออกเป็นบล็อก และแต่ละบล็อกจะถูกแปลงโดยชุดการดำเนินการทางคณิตศาสตร์โดยใช้คีย์ เอาต์พุตเป็นข้อความไซเฟอร์เท็กซ์ที่มีความยาวเท่ากับอินพุต
Key ขนาด
AES รองรับคีย์สามขนาด:
- AES-128 — คีย์ 128 บิต, 10 รอบภายใน Operations
- AES-192 — คีย์ 192 บิต, 12 รอบ
- AES-256 — คีย์ 256 บิต, 14 รอบ
ทั้งสามรายการถือว่าปลอดภัย AES-128 มีคีย์ที่เป็นไปได้ 2^128 คีย์ ซึ่งอยู่นอกเหนือขอบเขตการใช้กำลังดุร้าย — ด้วยความพยายาม 1 ล้านล้านครั้งต่อวินาที การใช้คีย์สเปซจนหมดจะใช้เวลาประมาณ 10 ล้านล้านปี AES-256 ได้รับเลือกสำหรับการรักษาความปลอดภัยเพิ่มเติมเล็กน้อยเทียบกับความก้าวหน้าในการเข้ารหัสในอนาคต โดยเฉพาะอย่างยิ่งควอนตัม (อัลกอริทึมของ Grover ลดความแข็งแกร่งของคีย์ที่มีประสิทธิผลลงครึ่งหนึ่งเมื่อเทียบกับคอมพิวเตอร์ควอนตัม ดังนั้น AES-256 จึงให้ระดับความปลอดภัยหลังควอนตัมที่ 128 บิต)
วิธีที่ AES ทำงานจริงภายใน
สำหรับแต่ละบล็อก AES ดำเนินการตามลำดับการดำเนินการกับหลายบล็อก รอบ:
- SubBytes — แทนที่แต่ละไบต์โดยใช้ตารางการแทนที่แบบไม่เชิงเส้น (S-box)
- ShiftRows — วนรอบแต่ละแถวของสถานะ 4x4 matrix.
- MixColumns — คูณแต่ละคอลัมน์ด้วยเมทริกซ์คงที่ (ในฟิลด์จำกัดพิเศษ)
- AddRoundKey — XOR ด้วยคีย์เฉพาะแบบกลมที่ได้มาจากคีย์หลัก
การรวมกันของการแทนที่และการเรียงสับเปลี่ยนทำให้เกิดทั้งความสับสน (แต่ละบิตเอาท์พุตขึ้นอยู่กับบิตคีย์จำนวนมาก) และการแพร่กระจาย (บิตข้อความธรรมดาแต่ละบิตมีอิทธิพลต่อบิตเอาท์พุตจำนวนมาก) — คุณสมบัติทั้งสองที่แชนนอนระบุว่าจำเป็นสำหรับการเข้ารหัสที่ปลอดภัย
โหมดการทำงาน
AES เข้ารหัสทีละบล็อก ในการเข้ารหัสข้อมูลที่ยาวขึ้น โหมด ของการดำเนินการ จะกำหนดวิธีการบล็อกเชน โหมดสำคัญ:
- ECB (Electronic Codebook) — แต่ละบล็อกเข้ารหัสอย่างอิสระ อย่าใช้เพื่ออะไร; บล็อกข้อความธรรมดาที่เหมือนกันจะสร้างข้อความไซเฟอร์ที่เหมือนกันและเปิดเผยโครงสร้าง
- CBC (Cipher Block Chaining) — แต่ละบล็อก XORed ด้วยข้อความไซเฟอร์ก่อนหน้าก่อนการเข้ารหัส มาตรฐานเป็นเวลาหลายปี เสี่ยงต่อการโจมตีแบบ padding-oracle หากไม่ได้รับการรับรองความถูกต้อง
- CTR (Counter) — เข้ารหัสตัวนับที่เพิ่มขึ้นและ XOR ด้วยข้อความธรรมดา เปลี่ยน AES ให้เป็นรหัสสตรีมได้อย่างมีประสิทธิภาพ
- GCM (โหมด Galois/Counter) — แท็ก CTR + การตรวจสอบสิทธิ์ในการส่งผ่านครั้งเดียว โหมดสมัยใหม่ที่โดดเด่น ใช้โดย TLS 1.3, WireGuard และโปรโตคอลใหม่ส่วนใหญ่ AEAD (Authenticated Encryption with Associated Data) เป็นชื่อที่เป็นทางการสำหรับคลาสนี้
หากคุณกำลังเลือกโหมด AES ในปัจจุบัน ให้ใช้ AES-GCM เว้นแต่คุณจะมีเหตุผลเฉพาะที่จะไม่เลือก AES-CBC ธรรมดาที่ไม่มี HMAC นั้นเป็นปืนลูกซอง
การเร่งความเร็วฮาร์ดแวร์
Intel เปิดตัวชุดคำสั่ง AES-NI ในปี 2010; ARM ก็ทำเช่นเดียวกันในอีกไม่กี่ปีต่อมา CPU สมัยใหม่เข้ารหัส AES ในอัตราที่เกิน 10 GB/s ต่อคอร์ การเข้ารหัสนั้นไม่มีค่าใช้จ่าย CPU เป็นหลัก คอขวดสำหรับการสื่อสารที่เข้ารหัสนั้นแทบจะไม่มี AES เลย
นี่คือเหตุผลว่าทำไม AES-GCM จึงเป็นค่าเริ่มต้นในโปรโตคอลสมัยใหม่: ทั้งปลอดภัยและฟรีอย่างมีประสิทธิภาพบนฮาร์ดแวร์ หากไม่มีการสนับสนุนด้านฮาร์ดแวร์ ChaCha20-Poly1305 เป็นทางเลือกที่ต้องการเนื่องจากเร็วกว่าซอฟต์แวร์ AES บน CPU และคอร์ ARM แบบธรรมดา
ในกรณีที่ไม่ได้ใช้ AES
สถานที่บางแห่งหลีกเลี่ยง AES อย่างชัดเจน WireGuard ใช้ ChaCha20 เนื่องจากโปรโตคอลกำหนดเป้าหมายไปที่อุปกรณ์ฝังตัวและมีความหลากหลายของการเข้ารหัสน้อยที่สุด โปรโตคอลรุ่นเก่า (SSH ดั้งเดิม, OpenVPN รุ่นเก่า) ยังคงเป็นค่าเริ่มต้นสำหรับการเข้ารหัสอื่น ๆ เพื่อความเข้ากันได้ ทอร์ใช้รหัสผสมที่เลือกไว้เพื่อความหลากหลายมากกว่าประสิทธิภาพ แต่สำหรับการเข้ารหัสวัตถุประสงค์ทั่วไปแบบใหม่ — การเข้ารหัสดิสก์ การเชื่อมต่อ TLS การเข้ารหัสไฟล์ — AES เป็นค่าเริ่มต้นและตัวเลือกที่ปลอดภัย
คณิตศาสตร์ยังคงอยู่
หลังจากกว่าสองทศวรรษของการเข้ารหัส AES ไม่มีการโจมตีในทางปฏิบัติ การโจมตีทางวิชาการที่ดีที่สุดกับการเข้ารหัสแบบเต็มจะช่วยลดต้นทุนแบบ brute-force ลงประมาณ 4 เท่า ซึ่งหมายความว่าการรักษาความปลอดภัยที่มีประสิทธิภาพของ AES-128 อยู่ที่ประมาณ 126 บิต ซึ่งยังคงทำได้ยากโดยสิ้นเชิง การโจมตีช่องทางด้านข้าง (การกำหนดเวลา การวิเคราะห์พลังงาน) สามารถเปิดเผยคีย์ต่างๆ เมื่อการใช้งานนั้นไร้เดียงสา แต่การใช้งานตามเวลาคงที่พร้อมการเร่งด้วยฮาร์ดแวร์จะปิดช่องโหว่นั้น การเข้ารหัสนั้นปลอดภัย
ตามมาตรการที่สมเหตุสมผลคำถามที่พบบ่อย
- AES-256 ดีกว่า AES-128 หรือไม่
- ปลอดภัยกว่าในนาม ในทางปฏิบัติทั้งเกินกว่ากำลังดุร้ายในทางปฏิบัติ เหตุผลหลักในการเลือก AES-256 คือความยืดหยุ่นหลังควอนตัม อัลกอริธึมของ Grover ลดความปลอดภัยที่มีประสิทธิภาพต่อผู้โจมตีควอนตัมลงครึ่งหนึ่ง ดังนั้น AES-256 จึงให้การรักษาความปลอดภัยหลังควอนตัม 128 บิต เทียบกับ 64 บิตของ AES-128 (ซึ่งเริ่มไม่สะดวกใจ) สำหรับบริบทส่วนใหญ่ ทั้งสองอย่างก็ดี
- AES สามารถถอดรหัสได้หรือไม่?
- ไม่ใช่ด้วยกำลังอันดุร้ายในเวลาจริงใดๆ การโจมตีช่องทางด้านข้างบน AES ที่ใช้งานไม่ดีได้กู้คืนคีย์แล้ว การโจมตีแบบเข้ารหัสลับบน AES แบบลดรอบนั้นมีอยู่ แต่ AES 10/12/14 รอบเต็มรูปแบบที่มีการดำเนินการตามเวลาคงที่นั้นไม่ทราบถึงการหยุดพักในทางปฏิบัติ ตัวเข้ารหัสนั้นเป็นเสียง
- เหตุใดบางระบบจึงใช้ ChaCha20 แทน AES
- ประสิทธิภาพบนฮาร์ดแวร์ที่ไม่มี AES-NI (อุปกรณ์ฝังตัว, แกน ARM รุ่นเก่า, ไมโครคอนโทรลเลอร์ธรรมดา) ChaCha20 ถูกนำไปใช้ในซอฟต์แวร์ด้วยความเร็วที่แข่งขันได้กับ AES ที่เร่งด้วยฮาร์ดแวร์ ใน x86 สมัยใหม่และ ARM พร้อม AES-NI โดยปกติแล้ว AES จะเร็วกว่า WireGuard เลือก ChaCha20 เพื่อให้มั่นใจถึงประสิทธิภาพที่สม่ำเสมอในฮาร์ดแวร์
- AES-GCM กับ AES-CBC คืออะไร
- ทั้งสองโหมดเป็นโหมดการทำงาน AES AES-GCM เป็นการเข้ารหัสที่มีการรับรองความถูกต้อง — โดยจะเข้ารหัสและสร้างแท็กการตรวจสอบในการส่งผ่านครั้งเดียว เอาชนะการปลอมแปลง AES-CBC เป็นเพียงการเข้ารหัส หากคุณต้องการการรับรองความถูกต้อง คุณต้องเพิ่ม HMAC แยกต่างหาก และการทำให้การรวมกันถูกต้องนั้นอาจเลอะเทอะได้ง่าย ใช้ GCM สำหรับการออกแบบใหม่
- AES ป้องกันคอมพิวเตอร์ควอนตัมหรือไม่
- การเข้ารหัสแบบสมมาตร เช่น AES มีความทนทานต่อควอนตัมได้ดีกว่า RSA หรือ ECDH มาก อัลกอริธึมของ Grover ลดความแรงของคีย์ที่มีประสิทธิภาพลงครึ่งหนึ่ง - AES-256 จะเทียบเท่ากับคีย์คลาสสิก 128 บิต แต่ก็ยังทำไม่ได้ AES-128 กลายเป็น 64 บิต ซึ่งไม่สะดวกนัก คำแนะนำหลังควอนตัมคือ AES-256 บวกกับแท็ก MAC ขนาดใหญ่