Lecture 6 — Integrity & Basic Encryption
จะรู้ได้ยังไงว่าข้อมูลยังเป็นชิ้นเดิม คาบนี้ตอบสองทาง คือให้ฮาร์ดแวร์กั้นไว้ กับเข้ารหัสมันเสียเลยเมื่อไม่มีฮาร์ดแวร์ให้พึ่ง
เลกเชอร์ 6 · อ่าน 70 นาที · เรียบเรียงจากสไลด์ Chapter 6 ของ Krerk Piromsopa, Ph.D.
Integrity คือการที่ของยังเป็นชิ้นเดิม ไม่ถูกแก้ ไม่ถูกแทน และได้มาจากสองทางเท่านั้น — ฮาร์ดแวร์กั้นไว้ หรือ เข้ารหัสมันไว้ ข้อมูลที่ออกจากเครื่องไปแล้ว เช่นอยู่ในแฟลชไดรฟ์ ในอีเมล หรือในแพ็กเก็ตบนสาย ไม่มีฮาร์ดแวร์ตัวไหนคุ้มครองอีก จึงเหลือทางเดียว
เนื้อหามาจากสไลด์ Chapter 6 ทั้ง 47 หน้า คำนิยาม ชื่ออัลกอริทึม ปี ชื่อคน และตัวอย่างรหัสทุกชุดมาจากสไลด์จริง ส่วนคำอธิบาย รูป และกล่องที่ติดป้าย "เสริม" เขียนขึ้นใหม่
ตัวอย่างรหัสสี่ชุดในหน้านี้ถอดออกมาแล้วตรวจซ้ำด้วยโปรแกรมทุกชุด ผลตรงกับที่สไลด์เขียนไว้
คาบนี้จะพาไปไหน
| คำถาม | คำตอบอยู่ที่ |
|---|---|
| Integrity คืออะไร และต่างจาก AAA สามตัวเดิมยังไง | ส่วนที่ 1 |
| ทำไมทุกอย่างต้องเริ่มจากคำว่า trust | ส่วนที่ 2 |
| ฮาร์ดแวร์ช่วยรักษา integrity ได้ยังไง | ส่วนที่ 3 |
| ถ้าไม่มีฮาร์ดแวร์ให้พึ่งล่ะ | ส่วนที่ 4 |
| Hash คืออะไร ทำไมถึงไม่เรียกว่าการเข้ารหัส | ส่วนที่ 5 |
| กุญแจดอกเดียวสองฝั่ง ทำงานยังไงและพังตรงไหน | ส่วนที่ 6 |
| ข้อความยาวกว่าหนึ่งก้อน ส่งเข้า cipher ยังไง | ส่วนที่ 7 |
| กุญแจคนละดอกแก้ปัญหาอะไรได้ | ส่วนที่ 8 |
| การเข้ารหัสให้อะไร และมีจุดอ่อนตรงไหน | ส่วนที่ 9 |
| ของจริงอย่าง HTTPS ประกอบขึ้นมายังไง | ส่วนที่ 10 |
ส่วนที่ 1 — Integrity คือ A ตัวที่สี่
Integrity without knowledge is weak and useless, and knowledge without integrity is dangerous and dreadful.
ความซื่อตรงที่ไม่มีความรู้นั้นอ่อนแอและไร้ประโยชน์ ส่วนความรู้ที่ไม่มีความซื่อตรงนั้นอันตรายและน่ากลัว
— Samuel Johnson (1709 – 1784)
นิยาม
Integrity (ความครบถ้วนไม่ถูกแก้ไข) มีสองความหมายที่เป็นเรื่องเดียวกัน
- กับคน — คุณสมบัติของคนที่เป็นตัวของตัวเองเต็มที่ คือ whole, complete, unbroken, and undivided ครบ สมบูรณ์ ไม่แตก ไม่แบ่ง และการรู้จักตัวเองทำให้ integrity ของคนคนนั้นสูงขึ้น
- กับข้อมูล — สภาพของการเป็นชิ้นเดียวไม่ถูกแบ่ง หรือ unified and unimpaired คือรวมกันอยู่และไม่ถูกทำให้เสียหาย
ทำไมมันคือ A ตัวที่สี่
Integrity บางครั้งถูกเรียกว่า Authenticity (ความเป็นของแท้) จึงถูกนับเป็น A ตัวที่สี่ ต่อจาก Authentication, Authorization และ Auditing ซึ่งแต่ละตัวมีคาบของตัวเองใน Lecture 3 ถึง Lecture 5
สามตัวเดิมตอบคำถามเกี่ยวกับ คน ทั้งหมด
Authentication ถามว่าคุณคือใคร Authorization ถามว่าคุณทำอะไรได้ Auditing ถามว่าใครทำอะไรไปแล้วบ้าง
Integrity ถามคำถามที่ต่างออกไป คือถามเกี่ยวกับ ของ — ไฟล์ชิ้นนี้ยังเป็นชิ้นเดิมอยู่ไหม ข้อความนี้ระหว่างทางถูกแก้หรือเปล่า
และนี่คือเหตุผลที่มันมาทีหลัง เพราะสามตัวแรกจะเชื่อถือได้ก็ต่อเมื่อของที่มันทำงานด้วย — ตารางสิทธิ์ ไฟล์รหัสผ่าน ตัว log เอง — ยังไม่ถูกแก้ ถ้า integrity พัง ทั้งสามตัวข้างบนพังตามทันที
คำถามหลักของเรื่องนี้คือ How can we preserve the integrity of data? เราจะรักษาความครบถ้วนของข้อมูลได้ยังไง
คำตอบสั้น ๆ คือ Integrity requires (hardware) supports — integrity ต้องมีฮาร์ดแวร์หนุน และเมื่อไม่มีฮาร์ดแวร์ ก็ต้องหาอย่างอื่นมาแทน
ส่วนที่ 2 — Trust คือฐานของทุกอย่าง และเราต้องลดมัน
Real integrity is doing the right thing, knowing that nobody's going to know whether you did it or not.
ความซื่อตรงจริง ๆ คือการทำสิ่งที่ถูก ทั้งที่รู้ว่าไม่มีใครจะรู้ว่าเราทำหรือไม่ได้ทำ
— Oprah Winfrey, ใน Good Housekeeping
ทุกโมเดลความปลอดภัยตั้งอยู่บน trust
Trust (ความไว้วางใจ) คือ basis for every security model คือฐานของทุกโมเดลความปลอดภัย
พจนานุกรม Merriam-Webster ให้ความหมายว่า believe in the reliability, truth, ability, or strength of คือเชื่อในความน่าเชื่อถือ ความจริง ความสามารถ หรือความแข็งแรงของสิ่งนั้น
คำถามที่ตามมาคือ แล้วเราไว้ใจอะไรอยู่บ้าง
- ไว้ใจ ตัวประมวลผล หรือเปล่า
- ไว้ใจ ผู้ใช้หรือนักพัฒนา หรือเปล่า
- ไว้ใจ ซอฟต์แวร์หรือโพรเซส หรือเปล่า
สามข้อนี้ไม่ใช่คำถามเชิงปรัชญา มันคือรายการสิ่งที่ต้องตัดสินใจก่อนออกแบบระบบ
ทุกครั้งที่ตอบว่า "ไว้ใจ" เรากำลังบอกว่าถ้าสิ่งนั้นโกหก ระบบทั้งระบบพัง โดยไม่มีอะไรจับได้
ตัวอย่างที่ชัดที่สุดคือตัวประมวลผล ถ้าตัวประมวลผลถูกฝังคำสั่งลับไว้ ระบบปฏิบัติการที่รันอยู่บนมันไม่มีทางรู้เลย เพราะทุกอย่างที่ระบบปฏิบัติการเห็น ก็เห็นผ่านตัวประมวลผลตัวนั้น
ระบบที่ไว้ใจทุกอย่าง หน้าตาเป็นแบบไหน
| ตัวอย่าง | ไว้ใจอะไร |
|---|---|
ระบบปฏิบัติการผู้ใช้เดียวที่ไม่มีการป้องกัน เช่น DOS, CP/M, Windows < NT | ไว้ใจทุกโปรแกรมที่รัน |
| ระบบฝังตัวและเครื่องใช้ เช่นตัวควบคุมเครื่องปรับอากาศ | ไว้ใจว่าไม่มีใครมายุ่งกับมัน |
| โทรศัพท์มือถือรุ่นเก่า | ไว้ใจซอฟต์แวร์ที่ติดมากับเครื่อง |
รูปแบบนี้ยังอยู่ เช่น สคริปต์ที่ก๊อปมาจากอินเทอร์เน็ตแล้ววางลง terminal ให้รันด้วยสิทธิ์ผู้ดูแลระบบ ซึ่งเครื่องมีกลไกป้องกันครบทุกอย่าง แต่ผู้ใช้ยกสิทธิ์ให้เองทั้งก้อน
อีกสองที่ที่รูปแบบนี้ย้ายไปอยู่
- ไมโครคอนโทรลเลอร์ในอุปกรณ์ IoT โค้ดทั้งหมดรันในระดับสิทธิ์เดียวกัน ไม่มีการแยกโค้ดของระบบออกจากโค้ดของผู้ใช้
- เฟิร์มแวร์ของอุปกรณ์ต่อพ่วง เช่นตัวควบคุมฮาร์ดดิสก์หรือการ์ดเครือข่าย ซึ่งรันก่อนระบบปฏิบัติการและระบบปฏิบัติการตรวจไม่ได้
ลดความไว้ใจด้วยการขีดขอบเขต
ในความเป็นจริงเราไว้ใจทุกอย่างไม่ได้ ทางออกจึงไม่ใช่การเลิกไว้ใจ แต่คือ ลดสิ่งที่ต้องไว้ใจให้เหลือน้อยที่สุด
วิธีคือ trust with respect to boundary คือกำหนดความไว้ใจโดยอิงกับขอบเขต ซึ่งทำได้สองแบบ
- Sandbox (กระบะทราย พื้นที่จำกัดที่ให้โค้ดแปลกหน้าเล่นได้) — ล้อมโค้ดที่ไม่ไว้ใจไว้ในพื้นที่เล็ก ๆ
- Domains (isolation) (เขตที่แยกออกจากกัน) — แบ่งระบบเป็นเขต แล้วไม่ให้เขตหนึ่งเห็นอีกเขต
Sandbox เริ่มจากโค้ดหนึ่งชิ้นที่เราไม่ไว้ใจ แล้วล้อมกรอบรอบมัน ข้างในกรอบทำอะไรก็ได้ ข้างนอกกรอบห้ามแตะ
Domain เริ่มจากระบบทั้งระบบ แล้วซอยเป็นเขต ๆ ทุกเขตถูกจำกัดเท่ากันหมด ไม่มีเขตไหนพิเศษกว่าเขตไหน เช่นแต่ละโพรเซสมีหน่วยความจำของตัวเองที่โพรเซสอื่นมองไม่เห็น
ผลลัพธ์คล้ายกันคือของข้างในออกมาข้างนอกไม่ได้ แต่ตอนออกแบบคิดคนละแบบ กล่องนี้เป็นคำอธิบายเสริม
Sandbox
โมเดล sandbox เป็นที่รู้จักขึ้นมาเพราะ Java Applet
ผู้ใช้มีทางเลือกว่าจะไว้ใจ applet ซึ่งเป็นโค้ดจากเครื่องอื่นหรือไม่
- ถ้าไว้ใจ โค้ดจะรันด้วยสิทธิ์เต็มของเครื่อง
- ถ้าไม่ไว้ใจ โค้ดจะถูกจำกัดอยู่ใน sandbox เช่นแตะไฟล์ในเครื่องไม่ได้
การตัดสินใจว่าจะไว้ใจหรือไม่ อิงจาก Code Signing (การเซ็นกำกับโค้ด) คือดูว่าใครเซ็นกำกับโค้ดชิ้นนั้นมา
แล้วคำถามก็ไล่ต่อกันเป็นชั้น ๆ
- คุณไว้ใจให้ใครเซ็นโค้ดของคุณ
- applet หรือ ActiveX ที่เซ็นแล้ว เป็นโปรแกรมที่ปลอดภัยหรือเปล่า ซึ่ง ActiveX คือโค้ดของ Microsoft ที่หน้าเว็บดึงมารันในเครื่องเหมือน applet แต่ไม่มี sandbox เลย รันด้วยสิทธิ์เต็มของผู้ใช้ และมีลายเซ็นเป็นด่านเดียว (ประโยคนี้เป็นข้อมูลเสริม)
- เทียบเคียง — ซอฟต์แวร์ที่เขียนโดยนักพัฒนาที่มีคุณสมบัติครบ เช่น Microsoft หรือ Oracle เป็นซอฟต์แวร์ที่ปลอดภัยหรือเปล่า
คำตอบของทั้งสามข้ออยู่ในประโยคเดียว
Trust ≠ Secure — ไว้ใจ ไม่เท่ากับ ปลอดภัย
ลายเซ็นตอบได้แค่คำถามเดียวคือ ใครเป็นคนเขียน มันไม่ได้ตอบว่าโค้ดนั้นเขียนดีหรือเปล่า
Microsoft เซ็นโค้ดที่มีช่องโหว่มาแล้วนับไม่ถ้วน ลายเซ็นไม่ได้ผิด เพราะมันไม่เคยสัญญาว่าโค้ดจะไม่มีบั๊ก มันสัญญาแค่ว่าโค้ดมาจากคนคนนี้จริง และไม่ถูกแก้ระหว่างทาง
ซึ่งถ้าสังเกตให้ดี สองอย่างที่ลายเซ็นสัญญานั้นคือ authentication กับ integrity พอดี ไม่ใช่ security ทั้งก้อน
ลองตอบดู: ผู้ใช้กดไว้ใจ applet ที่บริษัทใหญ่เซ็นมาถูกต้อง แต่ applet ตัวนั้นมีบั๊กที่ทำให้เว็บอื่นสั่งลบไฟล์ในเครื่องได้ sandbox ช่วยกันไฟล์ไว้ได้ไหม
ไล่จากกติกาของ sandbox ผู้ใช้กดไว้ใจแล้ว applet จึงรันด้วยสิทธิ์เต็มของเครื่อง ไม่ได้อยู่ใน sandbox ตั้งแต่แรก ลายเซ็นยืนยันได้แค่ว่าบริษัทนั้นเขียนจริง ไม่ได้ยืนยันว่าไม่มีบั๊ก
คำตอบคือ ช่วยไม่ได้ ไฟล์ถูกลบได้
คำตอบที่ผิดบ่อยคือ "ช่วยได้ เพราะ Java มี sandbox" sandbox มีอยู่จริง แต่ใช้กับโค้ดที่ ไม่ถูกไว้ใจ เท่านั้น นี่คือ Trust ≠ Secure ในรูปที่เจอจริง
คำถามที่เหลือคือ กลไกอะไรที่จำเป็นต่อการสร้าง sandbox หรือ domain
ส่วนที่ 3 — ฮาร์ดแวร์ที่ทำให้ขอบเขตเป็นจริง
สมมติ sandbox เป็นแค่โปรแกรมตรวจตัวหนึ่ง ที่ดักทุกครั้งที่โค้ดแปลกหน้าขอเปิดไฟล์ ถ้าโปรแกรมตรวจกับโค้ดนั้นเป็นโค้ดเครื่องที่รันด้วยสิทธิ์ระดับเดียวกันในหน่วยความจำเดียวกัน โค้ดนั้นก็เขียนทับโปรแกรมตรวจให้ตอบว่า "อนุญาต" ทุกครั้งได้
sandbox ที่บังคับด้วยซอฟต์แวร์ เช่น JVM ที่ตรวจ Java applet จึงแข็งแรงได้แค่เท่ากับของที่อยู่ข้างใต้มัน ต้องมีของที่ซอฟต์แวร์แก้ไม่ได้มากั้นไว้ชั้นล่างสุด
คำตอบของคำถามข้างบนจึงคือ ต้องมีฮาร์ดแวร์หนุน
ฮาร์ดแวร์ที่หนุน integrity มีสองกลุ่ม คือ electronic curtain กับ tagged memory แต่ละกลุ่มมีหัวข้อของตัวเองข้างล่าง
Ring
Electronic Curtain (ม่านไฟฟ้า) คือเส้นแบ่งที่ตัวประมวลผลขีดไว้ในหน่วยความจำ โค้ดฝั่งนอกข้ามไปฝั่งในเองไม่ได้ (นิยามนี้เป็นคำอธิบายเสริม) วิธีทำม่านนี้คือ Ring (วงแหวนระดับสิทธิ์)
Ring เป็นที่รู้จักขึ้นมาจาก Multics ในปี 1960
หลักการมีสามข้อ
- ตัวประมวลผลแบ่งหน่วยความจำเป็นช่อง แล้ว ผูกแต่ละช่องไว้กับวงแหวนหนึ่งวง
- แบ่งช่องได้สองแบบคือ Segmentation (การแบ่งเป็นส่วนตามความหมาย) และ Page (การแบ่งเป็นหน้าขนาดเท่ากัน)
- วงในเข้าถึงวงนอกได้ แต่ วงนอกเข้าวงในได้ทางเดียวคือผ่านวิธีที่กำหนดไว้ ซึ่งก็คือ System Call (คำขอให้ระบบปฏิบัติการทำงานแทน)
ในระบบปฏิบัติการส่วนใหญ่ วงในสุดคือ ring 0 เป็นที่อยู่ของ Kernel (แกนของระบบปฏิบัติการ) และ Device Driver (โค้ดที่คุมอุปกรณ์) ส่วนโปรแกรมทั่วไปอยู่วงนอก system call คือคำขอที่โปรแกรมส่งให้ kernel ทำงานแทน เช่นเขียนไฟล์ลงดิสก์ ย่อหน้านี้เป็นคำอธิบายเสริม
Segmentation แบ่งตามความหมายของข้อมูล ช่องหนึ่งคือโค้ด อีกช่องคือข้อมูล อีกช่องคือ stack ขนาดแต่ละช่องไม่เท่ากัน เพราะขึ้นกับว่าของข้างในใหญ่แค่ไหน
Page แบ่งตามขนาดตายตัว ทุกช่องเท่ากันหมด เช่นช่องละ 4 KB โดยไม่สนใจว่าข้างในเป็นอะไร
ระบบสมัยใหม่ใช้ page เป็นหลักเพราะจัดการง่ายกว่า และวางหน้าใดหน้าหนึ่งไว้ตรงไหนของหน่วยความจำจริงก็ได้ กล่องนี้เป็นคำอธิบายเสริม
คำถามที่ตามมาคือ How many rings do we really need? จริง ๆ แล้วเราต้องการกี่วง
Intel x86 มี 4 ring แต่ ระบบปฏิบัติการส่วนใหญ่ใช้แค่ 2 วง คือ 0 กับ 3 ส่วน IBM OS/2 น่าจะเป็นระบบปฏิบัติการเดียวที่วาง device driver ไว้ที่ ring 1 และ ring 2
สองวงที่เหลือไม่ได้ไร้ประโยชน์ แต่ต้นทุนของมันไม่คุ้ม
ระบบปฏิบัติการต้องย้ายไปมาระหว่างวงบ่อยมาก และการข้ามวงแต่ละครั้งมีราคาเป็นเวลาที่เสียไป ยิ่งใช้หลายวง โค้ดยิ่งซับซ้อน และยิ่งผูกติดกับสถาปัตยกรรมเดียว
ที่สำคัญกว่านั้นคือ ระบบปฏิบัติการที่อยากรันได้บนหลายสถาปัตยกรรมต้องใช้เท่าที่ทุกสถาปัตยกรรมมีเหมือนกัน ซึ่งก็คือสองวง
ลองตอบดู: โปรแกรมแก้รูปที่รันใน ring 3 ต้องการบันทึกไฟล์ลงดิสก์ แต่ device driver ของดิสก์อยู่ใน ring 0 โปรแกรมทำได้ยังไง
ไล่จากกติกาของ ring วงนอกเข้าวงในได้ทางเดียวคือผ่านวิธีที่กำหนดไว้ โปรแกรมจึงเรียก system call ขอให้ระบบปฏิบัติการเขียนแทน แล้ว kernel ใน ring 0 เป็นคนสั่ง driver
คำตอบคือ ทำได้ แต่ต้องผ่าน system call และ kernel ตรวจได้ก่อนว่าโปรแกรมนี้มีสิทธิ์เขียนไฟล์นั้นหรือไม่
คำตอบที่ผิดบ่อยมีสองแบบ แบบแรกคือ "เรียก driver ตรง ๆ" ซึ่งตัวประมวลผลไม่ยอม แบบที่สองคือ "ทำไม่ได้เลย" ซึ่งลืมไปว่า ring ไม่ได้ปิดทาง แต่บังคับให้เข้าทางเดียว
Tagged Memory
บทนี้ให้ไว้แค่ชื่อ tagged memory คำอธิบายข้างล่างเขียนขึ้นใหม่
ถ้ามีคนยัดข้อมูลเข้าไปในที่ที่ควรเป็นคำสั่ง ring จับไม่ได้ถ้าช่องนั้นเป็นของวงเดียวกับโค้ดที่กำลังรัน เพราะ ring ผูกสิทธิ์ไว้กับ พื้นที่ คือดูแค่ว่าช่องนี้เป็นของวงไหน ไม่ได้ดูว่าของข้างในคืออะไร
Tagged Memory (หน่วยความจำที่ติดป้ายกำกับ) ผูกสิทธิ์ไว้กับ ตัวข้อมูลเอง ทุกคำในหน่วยความจำมีป้ายเล็ก ๆ ติดอยู่ บอกว่าคำนั้นคืออะไร เช่นเป็นจำนวนเต็ม เป็นคำสั่ง หรือเป็นตัวชี้ตำแหน่ง ตัวประมวลผลอ่านป้ายนี้ทุกครั้งที่แตะข้อมูล
ผลคือการเอาข้อมูลไปใช้ผิดประเภทถูกจับได้ทันที ข้อมูลที่ถูกยัดเข้ามามีป้ายไม่ตรงกับคำสั่ง ตัวประมวลผลจึงปฏิเสธตั้งแต่ตอนนั้น โดยไม่ต้องรอให้ระบบปฏิบัติการมาตรวจ
แล้วถ้าไม่มีฮาร์ดแวร์ให้พึ่งล่ะ
ข้อมูลในแฟลชไดรฟ์ ในอีเมล และในแพ็กเก็ตบนเครือข่าย ไม่ได้มีฮาร์ดแวร์คุ้มครองเสมอไป
Ring และ tagged memory ทำงานได้เพราะข้อมูลอยู่ในหน่วยความจำของเครื่องที่เราคุมตัวประมวลผลอยู่
พอข้อมูลออกจากเครื่องไปแล้ว ตัวประมวลผลตัวนั้นไม่เกี่ยวข้องอีกต่อไป ไฟล์ในแฟลชไดรฟ์ถูกเสียบเข้าเครื่องไหนก็ได้ แพ็กเก็ตวิ่งผ่านเราเตอร์ของใครก็ได้
integrity จึงต้องเดินทางไปกับตัวข้อมูลเอง แทนที่จะฝากไว้กับเครื่องที่มันเคยอยู่ และเครื่องมือที่ทำแบบนั้นได้คือการเข้ารหัส
หัวข้อ Hardware Integrity ในบทนี้ประกาศไว้ว่าจะพูดเรื่อง Physical Tamper Resistance คือการทำให้อุปกรณ์ทนต่อการงัดแงะทางกายภาพ แต่บทนี้ไม่ได้ลงรายละเอียดต่อ
โดยย่อคือการออกแบบให้ตัวเครื่อง ลบความลับของตัวเองทิ้งเมื่อถูกเปิด ตัวอย่างที่เห็นได้คือชิปในบัตรเครดิต โมดูลฮาร์ดแวร์ที่เก็บกุญแจ และเครื่อง ATM ซึ่งมีเซ็นเซอร์ตรวจแรงดัน อุณหภูมิ และแสง ถ้ามีคนพยายามแกะ กุญแจข้างในจะถูกล้างก่อนที่ใครจะอ่านได้
ย่อหน้าที่สองเป็นคำอธิบายเสริม
ส่วนที่ 4 — การเข้ารหัสยุคคลาสสิก และจุดที่มันแตก
Scytale — สลับตำแหน่ง ไม่เปลี่ยนตัวอักษร
การเข้ารหัสยุคคลาสสิกเริ่มที่ กรีก ราว 500 ปีก่อนคริสตกาล ด้วย Scytale ซึ่งเป็นการเข้ารหัสของกองทัพสปาร์ตา
Scytale เป็น Transposition Cipher (รหัสสลับตำแหน่ง) ที่ใช้แท่งไม้กับแถบหนัง คือ ตัวอักษรไม่ถูกเปลี่ยน มีแต่ตำแหน่งที่ถูกสลับ ซึ่งต่างจากรหัสในหัวข้อถัดไป
พันแถบหนังรอบแท่งไม้ที่มีเส้นผ่านศูนย์กลางเฉพาะ แล้วเขียนข้อความตามยาวของแท่ง พอคลายแถบหนังออก ตัวอักษรจะกระจายไม่เรียงกัน อ่านไม่รู้เรื่อง
ผู้รับต้องมีแท่งไม้ ขนาดเดียวกัน จึงจะพันกลับแล้วอ่านได้ ขนาดของแท่งไม้จึงทำหน้าที่เป็นกุญแจ
รหัสแทนที่ตัวอักษร
Monoalphabetic Substitution Cipher (รหัสแทนที่ตัวอักษรแบบตายตัว) คือการจับคู่ตัวอักษรแต่ละตัวกับอีกตัวหนึ่งแบบตายตัว Julius Caesar ใช้วิธีนี้เมื่อ 50 ปีก่อนคริสตกาล
ตารางตัวอย่างเป็นแบบนี้ แถวบนคือต้นฉบับ แถวล่างคือรหัส
a b c d e f g h i j k l m n o p q r s t u v w x y z
S E C U R I T Y A B D F G H J K L M N O P Q V W X Zลองตอบดู: ถอด YRFFJ VJMFU ด้วยตารางข้างบน
ไล่ทีละตัว โดยหาตำแหน่งของตัวอักษรรหัสในแถวล่าง แล้วอ่านตัวอักษรต้นฉบับที่ตำแหน่งเดียวกันในแถวบน
Y อยู่ตำแหน่งที่ 8 ของแถวล่าง ตำแหน่งที่ 8 ของแถวบนคือ h
ทำแบบเดียวกันจนครบ
cipher Y R F F J V J M F U
plain h e l l o w o r l dคำตอบคือ hello world
ถ้าได้ XMIIB QBGIP ที่อ่านไม่ออก แปลว่าหาตัวรหัสในแถวบนแทนแถวล่าง ซึ่งคือการเข้ารหัสซ้ำอีกรอบ ไม่ใช่การถอด
จุดที่รหัสแบบนี้แตก
จุดอ่อนของรหัสแทนที่แบบตายตัวมีข้อเดียว แต่ฆ่ามันได้ทั้งตระกูล
ถ้าข้อความยาวพอ มันจะถูกแกะได้ด้วยการเทียบความถี่ของตัวอักษรในข้อความที่เข้ารหัสแล้ว กับความถี่ของตัวอักษรในภาษาที่ใช้เขียนข้อความนั้น
เหตุผลอยู่ที่คำว่า ตายตัว
ถ้า e กลายเป็น R ทุกครั้งโดยไม่มีข้อยกเว้น ความถี่ของ e ในภาษาอังกฤษก็ย้ายไปอยู่กับ R ทั้งก้อน
ในภาษาอังกฤษ e เป็นตัวที่พบบ่อยที่สุด ตัวที่โผล่บ่อยที่สุดในข้อความที่เข้ารหัสแล้วจึงเป็น e แทบจะแน่นอน จากนั้นก็ไล่ตัวถัดไปทีละตัว
กุญแจไม่ได้ถูกเดา มันถูกอ่านออกมาจากตัวข้อความเอง และนี่คือเหตุผลที่รหัสสองแบบในส่วนที่ 6 ต้องทำให้ ตัวอักษรเดียวกันเข้ารหัสออกมาไม่เหมือนกัน
โจทย์คือข้อความนี้
Gur fbyhgvba gb gur pvcure vf gur anzr nhoerl juvpu jnf qvssvphyg gb fbyir
orpnhfr yvfgf bs cgbyrzl pbafgryyngvbaf jrer vapbafvfgrag. Vg gbbx frireny
snvyrq nggrzcgf orsber svaqvat n jbexnoyr yvfg.นับตัวอักษรในข้อความนี้ทั้ง 165 ตัว ตัวที่พบบ่อยที่สุดคือ r 21 ครั้ง ตามด้วย g 19 ครั้ง ถ้าเดาว่า r คือ e ซึ่งพบบ่อยที่สุดในภาษาอังกฤษ ระยะห่างคือ 13 ตำแหน่ง และ g ก็เลื่อน 13 ตำแหน่งได้ t ซึ่งพบบ่อยอันดับสองพอดี
การเลื่อนตัวอักษรทุกตัวไปเท่ากันเป็นรหัสแทนที่แบบตายตัวแบบหนึ่ง เรียกว่ารหัส Caesar เพราะ Julius Caesar เคยใช้แบบเลื่อน 3 ตำแหน่ง ส่วนตาราง SECURITY ข้างบนก็เป็นรหัสตระกูลเดียวกันอีกแบบ การนับตัวอักษรในย่อหน้าก่อนและเรื่องการเลื่อน 3 ตำแหน่งเป็นคำอธิบายเสริม ข้อความนี้คือ ROT13 ซึ่งเลื่อน 13 ตำแหน่ง ถอดได้เป็น
The solution to the cipher is the name aubrey which was difficult to solve
because lists of ptolemy constellations were inconsistent. It took several
failed attempts before finding a workable list.ลองทายก่อน: ถ้าเอาข้อความที่ถอดแล้วไปเลื่อน 13 ตำแหน่งอีกรอบ จะได้อะไร
คำตอบคือได้ข้อความรหัสชุดข้างบนคืนมา ROT13 มีคุณสมบัติที่ทำให้จำง่าย คือ เข้ารหัสกับถอดรหัสเป็นการกระทำเดียวกัน เพราะเลื่อนไป 13 สองครั้งเท่ากับเลื่อนไป 26 ซึ่งวนกลับมาที่เดิม
ส่วนที่ 5 — Hash: ทางเดียว ความยาวคงที่
การเข้ารหัสยุคใหม่แบ่งเป็นสามกลุ่ม คือ hash, symmetric และ public key และกลุ่มแรกคือกลุ่มที่แปลกที่สุด เพราะมันถอดกลับไม่ได้
ไฟล์ติดตั้งขนาดหลายกิกะไบต์ถูกวางไว้ที่ mirror site ทั่วโลก ซึ่งเจ้าของซอฟต์แวร์ไม่ได้คุมเครื่องพวกนั้น ผู้ใช้ที่ดาวน์โหลดจาก mirror จะรู้ได้ยังไงว่าไฟล์ไม่ถูกแก้ระหว่างทาง
เทียบกับต้นฉบับทีละไบต์ก็ต้องโหลดต้นฉบับมาอีกรอบ ซึ่งถ้าโหลดต้นฉบับได้ ก็ไม่ต้องใช้ mirror ตั้งแต่แรก ที่ต้องการคือ ของชิ้นเล็ก ๆ ที่แทนทั้งไฟล์ได้
Hash (ค่าย่อยของข้อมูล) หรือ Message Digest (ค่าย่อยของข้อความ) คือของชิ้นนั้น มีคุณสมบัติสามข้อ
- เป็น One-way Function (ฟังก์ชันทางเดียว) ซึ่งในทางทฤษฎีแล้ว ไม่มีฟังก์ชันผกผัน
- ข้อมูลเข้ายาวเท่าไหร่ก็ได้ ข้อมูลออกยาวคงที่
- และมีคำถามที่ต้องตอบให้ได้คือ Collision?
ลองทายก่อน: ไฟล์สองไฟล์ที่เนื้อหาต่างกัน จะได้ค่า hash ตรงกันได้ไหม
หน้าที่รวมรายชื่อการเข้ารหัสยุคใหม่เขียนกำกับ hash ไว้ว่า short input > long output คือเข้าสั้นออกยาว
แต่หน้าถัดมาที่อธิบาย hash โดยตรงเขียนว่า input may vary in size, output is a fix-length value คือเข้ายาวเท่าไหร่ก็ได้ ออกยาวคงที่
ข้อความหลังถูกต้อง SHA-256 ให้ผลยาว 256 บิตเสมอ ไม่ว่าจะป้อนไฟล์ 5 ไบต์หรือ 5 กิกะไบต์เข้าไป ยกมาบอกไว้เพราะถ้ากลับไปอ่านสไลด์เองจะเจอทั้งสองข้อความ
Collision คืออะไร และทำไมมันต้องมี
คำถาม Collision? ตอบได้ด้วยการนับ
ข้อมูลเข้ายาวเท่าไหร่ก็ได้ แปลว่าข้อมูลเข้าที่เป็นไปได้มีจำนวนไม่จำกัด
ข้อมูลออกยาวคงที่ เช่น 256 บิต แปลว่าข้อมูลออกที่เป็นไปได้มีจำนวนจำกัด คือ 2 ยกกำลัง 256 ค่า
ของไม่จำกัดถูกยัดลงในช่องที่จำกัด จึงต้องมีของคนละชิ้นที่ตกลงช่องเดียวกันแน่นอน นั่นคือ Collision (การชนกันของค่า hash) คือข้อมูลสองชิ้นที่ต่างกันแต่ได้ค่า hash เดียวกัน
collision จึงไม่ใช่บั๊ก มันเลี่ยงไม่ได้ คำถามที่แท้จริงคือ หามันเจอง่ายแค่ไหน ถ้ามีใครสร้างไฟล์สองไฟล์ที่ hash ตรงกันได้ตามใจ hash ตัวนั้นก็ใช้ตรวจ integrity ไม่ได้อีก
เอา hash ไปใช้ตรวจ integrity
ค่า hash ถูกใช้ตรวจ integrity อย่างแพร่หลาย เช่น ใช้ยืนยันว่าซอฟต์แวร์ที่ดาวน์โหลดจาก mirror site เป็นตัวเดียวกับต้นฉบับ ซึ่งคือโจทย์ตอนต้นส่วนนี้
เจ้าของซอฟต์แวร์ประกาศค่า hash ของไฟล์ไว้บนเว็บของตัวเอง ซึ่งเป็นข้อความสั้น ๆ บรรทัดเดียว ผู้ใช้ดาวน์โหลดจาก mirror ไหนก็ได้ แล้วคำนวณ hash เอง ถ้าตรงกับที่ประกาศไว้ ก็แปลว่าไฟล์ไม่ถูกแก้ระหว่างทาง
ของหนักฝากคนอื่นไว้ได้ ของที่ต้องเชื่อถือเหลือแค่บรรทัดเดียว
คนมักคิดว่า hash ของไฟล์ตรงกับที่หน้าดาวน์โหลดบอก แปลว่าไฟล์เป็นของแท้ ซึ่งไม่จริงเสมอไป
ความเชื่อนี้ดูถูก เพราะการคำนวณไม่ได้ผิด ไฟล์กับค่าที่ประกาศตรงกันจริง ๆ
แต่วิธีนี้ทำงานได้ก็ต่อเมื่อ ช่องทางที่ประกาศค่า hash เชื่อถือได้กว่าช่องทางที่ส่งไฟล์ ถ้าค่า hash ถูกวางไว้บนหน้าดาวน์โหลดหน้าเดียวกันกับไฟล์ คนที่แก้ไฟล์ได้ก็แก้ค่า hash ให้ตรงกับไฟล์ปลอมได้ด้วย การตรวจจึงไม่มีความหมาย
ส่วนนี้ยังโยงกลับไปที่ Trust ≠ Secure ในส่วนที่ 2 ด้วย เพราะสุดท้ายเราไว้ใจว่าเว็บที่ประกาศค่านั้นยังไม่ถูกยึด
Hash ถอดกลับไม่ได้ จึงบางทีไม่ถูกนับเป็นการเข้ารหัส การเข้ารหัสตามความหมายเดิมต้องเอากลับมาอ่านได้ ส่วน hash ทิ้งข้อความแล้วเหลือแค่ลายนิ้วมือ มันจึงใช้ตรวจว่าของเปลี่ยนหรือยังได้ แต่ใช้ส่งความลับไม่ได้
ลองตอบดู: เว็บหนึ่งเก็บค่า SHA-256 ของรหัสผ่านไว้แทนรหัสผ่านจริง ผู้ใช้คนหนึ่งลืมรหัสผ่าน ผู้ดูแลเว็บส่งรหัสผ่านเดิมกลับไปให้เขาได้ไหม
hash เป็นฟังก์ชันทางเดียว ไม่มีฟังก์ชันผกผัน และไม่มีกุญแจให้ใช้ถอด ค่าที่เก็บไว้จึงบอกได้แค่ว่ารหัสผ่านที่พิมพ์มาใหม่ให้ hash ตรงกับของเดิมหรือไม่ แต่ย้อนกลับไปเป็นรหัสผ่านเดิมไม่ได้
คำตอบคือ ส่งไม่ได้ เว็บทำได้แค่ให้ตั้งรหัสผ่านใหม่
คำตอบที่ผิดบ่อยคือ "ได้ ผู้ดูแลถอดรหัสออกมา" ซึ่งคือการมอง hash เป็นการเข้ารหัส ถ้าเว็บไหนส่งรหัสผ่านเดิมกลับมาได้ แปลว่าเว็บนั้นไม่ได้เก็บแค่ hash ส่วนวิธีที่คนเจาะใช้เดารหัสผ่านจาก hash อยู่ใน Lecture 3
ส่วนที่ 6 — Symmetric: กุญแจดอกเดียวสองฝั่ง
ตาราง SECURITY แปลง l เป็น F ทุกครั้ง hello จึงกลายเป็น YRFFJ ที่มี FF ซ้ำอยู่ตรงกลางเหมือนต้นฉบับ ลายของต้นฉบับหลุดออกมาให้นับได้
นี่คือปัญหาที่ส่วนที่ 4 ทิ้งไว้ และรหัสสองแบบข้างล่างแก้มันคนละวิธี
Symmetric Encryption (การเข้ารหัสแบบกุญแจเดียว) คือทั้งสองฝั่งใช้กุญแจดอกเดียวกัน แบ่งเป็นสองแบบตามหน่วยที่มันทำงานด้วย
Stream Cipher
Stream Cipher (รหัสแบบสายข้อมูล) ทำงานทีละตัวอักษรหรือทีละบิต
Vigenère (1467) เป็นหนึ่งในรหัสแบบนี้ตัวแรก ๆ หลักการมีสองข้อ
- ยืดกุญแจให้ยาวเท่ากับข้อมูล
- ตัวอักษรเดียวกันเข้ารหัสออกมาต่างกันได้ ขึ้นกับว่ามันอยู่ตำแหน่งไหน
LUCKYLUCK ---- กุญแจที่ยืดแล้ว
COMPUTING ---- ต้นฉบับ
NIOZSECPQ ---- ผลลัพธ์แต่ละตำแหน่งคือการบวกตัวอักษรสองตัวเข้าด้วยกันแบบวนรอบ โดยให้ A เท่ากับ 0
- ตำแหน่งที่ 1 —
Cเท่ากับ 2 บวกLเท่ากับ 11 ได้ 13 ซึ่งคือN - ตำแหน่งที่ 2 —
Oเท่ากับ 14 บวกUเท่ากับ 20 ได้ 34 ซึ่งเกิน 26 จึงลบ 26 เหลือ 8 ซึ่งคือI
RC4 คือ stream cipher ที่เคยถูกใช้ใน SSL, WEP และ WPA
ปัจจุบัน RC4 ถือว่าอ่อนเกินไป TLS ห้ามใช้แล้ว และหันไปใช้ AES-GCM เป็นหลัก โดยมี ChaCha20-Poly1305 ซึ่งสร้างจาก CHACHA ในรายชื่ออัลกอริทึมท้ายบทนี้เป็นอีกทางเลือก ส่วน Wi-Fi เลิกใช้ WEP และ WPA แล้วเปลี่ยนไปใช้ WPA2 ที่เข้ารหัสด้วย AES ย่อหน้านี้เป็นข้อมูลเสริม
Block Cipher
Block Cipher (รหัสแบบบล็อก) ทำงานทีละก้อน ไม่ใช่ทีละตัว
ตัวอย่างเก่าคือ Wheatstone-Playfair Cipher (1854) ซึ่ง ถูกใช้อย่างหนักในสงครามโลกครั้งที่สอง
หลักการมีสามข้อ
- สร้าง ตารางรหัส 5 × 5
- จับข้อมูลเป็นคู่ แล้วใช้มุมของสี่เหลี่ยมเป็นตัวเข้ารหัส
- ตัวอักษรเดียวกันเข้ารหัสออกมาต่างกันได้ ขึ้นกับว่าอยู่คู่กับตัวไหน
ตารางตัวอย่างคือ
F I R S T
A M E N D
B C G H K
L O P Q U
V W X Y Zและตัวอย่างคือ
CO MP UT ER ---- ต้นฉบับ จับเป็นคู่
OW EO ZD GE ---- ผลลัพธ์เลื่อนแต่ละตัวลงหนึ่งช่อง ถ้าอยู่แถวล่างสุดให้วนกลับขึ้นไปแถวบนสุด
คู่ CO เข้ากติกานี้ เพราะ C กับ O อยู่คอลัมน์ที่ 2 ทั้งคู่
ใต้ C คือ O และใต้ O คือ W ผลจึงเป็น OW
ทำไมตารางถึงขึ้นต้นด้วย FIRST AMEND (คำอธิบายเสริม)
ตาราง Playfair สร้างจากวลีกุญแจ เขียนตัวอักษรในวลีลงไปก่อนโดยไม่ซ้ำ แล้วเติมตัวที่เหลือของตัวอักษรทั้ง 26 ตัวตามลำดับ
ตารางนี้อ่านสองแถวแรกได้ว่า FIRST และ AMEND ซึ่งมาจากวลี FIRST AMENDMENT ส่วนที่เหลือ BCGHK LOPQU VWXYZ คือตัวอักษรที่ยังไม่ถูกใช้ เรียงตามลำดับ
ตาราง 5 × 5 มี 25 ช่อง แต่ตัวอักษรมี 26 ตัว จึงต้องยุบสองตัวเข้าด้วยกัน โดยทั่วไปคือ I กับ J ซึ่งตารางนี้ก็ไม่มี J เช่นกัน รายละเอียดเต็มอยู่ที่ Playfair cipher
ส่วนที่ 7 — Mode of Operation: ส่งแต่ละก้อนเข้า cipher ยังไง
Playfair จับทีละคู่ แต่ข้อความจริงยาวกว่าหนึ่งคู่เสมอ Block cipher ทุกตัวจึงเจอคำถามเดียวกัน คือหั่นข้อความเป็นก้อนแล้ว จะส่งแต่ละก้อนเข้า cipher ยังไง
วิธีตอบคำถามนี้เรียกว่า Mode of Operation (โหมดการทำงาน) แต่ละโหมดข้างล่างแก้ปัญหาที่โหมดก่อนหน้าทิ้งไว้
ทุกรูปเข้ารหัส hello ก้อนละ 1 ตัวอักษร กล่อง E คือตารางแทนที่ชุดเดียวกับส่วนที่ 4 หาตัวในแถวบนแล้วอ่านตัวใต้มัน เช่น E(h) ได้ Y
a b c d e f g h i j k l m n o p q r s t u v w x y z
S E C U R I T Y A B D F G H J K L M N O P Q V W X Zวงกลม ⊕ คือ บวกตัวอักษรแบบวนรอบ แบบ Vigenère ใช้เลขตามนี้ ผลรวมที่เกิน 25 ให้ลบ 26
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25AES ที่ใช้จริงทำงานแบบเดียวกันแต่ก้อนใหญ่กว่ามาก อยู่ในหัวข้อ "ของจริง — AES ทำงานกับ byte ไม่ใช่ตัวอักษร"
ECB — ส่งแต่ละก้อนเข้า E แยกกัน
- ECB ก้อนละตัวอักษรคือรหัสแทนที่ของส่วนที่ 4 ลายของต้นฉบับหลุดออกมา นับความถี่แล้วแกะได้
- คำถามที่ต้องถามกับทุกโหมดคือ Pattern is still there? เพราะ บางโหมดยังหาลายเจอได้อยู่ดี ลายยังอยู่ใน ECB และกลับมาได้ใน CBC ที่ใช้ IV เดิม หรือ CTR ที่ใช้ nonce ซ้ำ ซึ่งจะเจอข้างล่าง
CBC — บวกผลลัพธ์ของก้อนก่อนหน้าเข้าไปก่อน
ECB รั่วเพราะ l ตัวที่สองเข้า E ในสภาพเดียวกับตัวแรก
- เส้นจากผลลัพธ์ไปก้อนถัดไปคือ Chaining (การผูกเป็นลูกโซ่) ต้นฉบับซ้ำจึงไม่ได้ผลลัพธ์ซ้ำ
- กล่อง
sคือ Initial Vector (IV) (ค่าตั้งต้น) CBC กับรุ่นแปรของมันต้องมี IV เสมอ IV ต้องสุ่มใหม่ทุกครั้ง แต่ไม่ต้องเป็นความลับ ถ้าใช้ IV เดิม ข้อความเดิมจะได้ผลลัพธ์เดิม - เข้ารหัสทีละก้อนตามลำดับ ก้อนหลังต้องรอผลลัพธ์ของก้อนก่อน
PCBC — ส่งต้นฉบับตามไปด้วย
ใน CBC ถ้ามีคนแก้ผลลัพธ์ก้อนกลาง ผู้รับถอดแล้วเสียแค่ก้อนนั้นกับก้อนถัดไป ที่เหลือถอดได้ปกติ จึงอาจไม่ทันสังเกตว่าถูกแก้
- ต่างจาก CBC แค่เส้นจากต้นฉบับ
- ข้อนี้เป็นคำอธิบายเสริม ผลลัพธ์เสียก้อนเดียว ทุกก้อนหลังจากนั้นถอดออกมาเสีย การแก้ไขจึงเห็นง่ายขึ้น แต่สลับผลลัพธ์สองก้อนที่ติดกันแล้วก้อนหลังจากนั้นกลับถอดได้ปกติ จึงยังไม่นับว่าตรวจ integrity ได้
CFB และ OFB — ให้ E ผลิตกุญแจที่ไม่วนซ้ำ
กุญแจ LUCKY ของ Vigenère วนซ้ำทุก 5 ตัว ตัวที่ 1, 6, 11 ใช้ L เดียวกันหมด จึงเป็นรหัสแทนที่แบบตายตัวอีกชุด ข้อความยาวพอก็นับความถี่แยกทีละชุดแล้วแกะได้อีก
- ต้นฉบับไม่เข้า
EเลยEผลิต Keystream (สายกุญแจ) ที่ไม่วนซ้ำ block cipher จึงถูกใช้ทำงานแบบ stream cipher - เส้นที่วนกลับเข้า
Eคือ Feedback (การป้อนกลับ) CFB มี IV และใช้ผลลัพธ์เป็นตัวป้อนของก้อนถัดไป ส่วน OFB วน keystream กลับ
CTR — ใช้ตัวนับแทนการรอก้อนก่อนหน้า
CBC, CFB และ OFB ต้องทำทีละก้อน ก้อนที่ 1,000 ต้องรอก้อนที่ 999 เครื่องหลาย core ก็ช่วยไม่ได้
- Counter (CTR) (โหมดตัวนับ) ใช้ counter กับ nonce เป็นค่าตั้งต้นของแต่ละก้อน Nonce (ค่าที่ใช้ครั้งเดียว) เปลี่ยนใหม่ทุกข้อความแบบ IV
- ไม่ส่งอะไรข้ามก้อนเหมือน ECB แต่ไม่รั่ว เพราะตัวที่เข้า
Eเปลี่ยนทุกก้อน
คนมักคิดว่า nonce ไม่ใช่ความลับ ใช้ซ้ำก็ไม่เสียหาย ซึ่งผิด
ความเชื่อนี้ดูถูก เพราะ nonce ถูกส่งไปกับข้อความให้ใครก็เห็นได้อยู่แล้ว เหมือน IV
แต่ ห้ามใช้ nonce ซ้ำกับกุญแจเดิม เพราะ nonce เดิมแปลว่า keystream เดิม ส่ง hello กับ world ด้วย nonce c ทั้งคู่ h กลายเป็น J และ w กลายเป็น Y คนดักฟังเอา Y ลบ J ได้ 15 ซึ่งเท่ากับ w ลบ h พอดี keystream หายไปจากสมการ ใครรู้หรือเดาได้ว่าข้อความแรกขึ้นต้นด้วย h ก็ได้ w ของข้อความที่สองทันทีโดยไม่ต้องรู้กุญแจ OFB ที่ใช้ IV ซ้ำก็พังแบบเดียวกัน
GCM ย่อมาจาก Galois/Counter Mode เข้ารหัสแบบ CTR แล้วแนบ tag ที่คำนวณจากผลลัพธ์ทั้งหมดด้วยกุญแจ ผู้รับคำนวณซ้ำ ถ้าไม่ตรงก็ปฏิเสธทั้งข้อความ
โหมดอื่นในหัวข้อนี้ให้แค่ความลับ ไม่ได้บอกว่าข้อมูลถูกแก้หรือไม่ GCM จึงเป็นโหมดหลักของ TLS สมัยใหม่ กล่องนี้เป็นคำอธิบายเสริม
ของจริง — AES ทำงานกับ byte ไม่ใช่ตัวอักษร
AES (Advanced Encryption Standard) คือ block cipher มาตรฐานที่ใช้กันทั่วไปในปัจจุบัน (ข้อมูลเสริม บทนี้ให้ไว้แค่ชื่อ) ทุกโหมดข้างบนใช้กับ AES ได้ตรง ๆ ต่างกันแค่สามเรื่อง
หนึ่ง ก้อนใหญ่กว่า คอมพิวเตอร์เก็บตัวอักษรหนึ่งตัวเป็นตัวเลขขนาด 1 byte หรือ 8 bit เช่น h เก็บเป็น 104 ซึ่งเขียนเป็นบิตได้ 01101000 AES ใช้ก้อนละ 16 byte ข้อความภาษาอังกฤษ 16 ตัวอักษรจึงเป็นหนึ่งก้อนพอดี
| ค่า | ขนาด | |
|---|---|---|
| ต้นฉบับ | ABCDEFGHIJKLMNOP | 16 byte |
| กุญแจ | 000102030405060708090a0b0c0d0e0f | 16 byte เขียนเป็นเลขฐานสิบหก สองหลักต่อหนึ่ง byte |
| ผลลัพธ์ | 9cdd85de85b48bed892f02d8a5cbdacb | 16 byte อ่านเป็นตัวอักษรไม่ออกแล้ว จึงเขียนเป็นฐานสิบหก |
E ของ AES ทำตัวเหมือนตาราง SECURITY ข้างบน ต่างกันที่มีแถวให้เปิด 2128 แถวแทน 26 และกุญแจเป็นตัวเลือกว่าจะใช้ตารางไหน ก้อนเดิมกับกุญแจเดิมจึงได้ผลลัพธ์เดิมทุกครั้ง เหมือน E(h) ได้ Y ทุกครั้ง
สอง ผสมด้วย XOR แทนการบวกตัวอักษร XOR (ออร์เฉพาะ) เทียบสองค่าทีละบิต บิตเหมือนกันได้ 0 บิตต่างกันได้ 1 มันคือการบวกแบบวนรอบที่มีแค่สองค่า และ XOR ด้วยค่าเดิมซ้ำอีกครั้งได้ของเดิมคืน จึงใช้ได้ทั้งตอนผสมและตอนถอด
01101000 h
XOR 00000011
------------
01101011 kสาม ก้อนสุดท้ายมักไม่เต็ม ข้อความ 20 byte ได้ก้อนเต็มหนึ่งก้อน กับเศษ 4 byte ที่ E รับไม่ได้ Padding (การเติมให้เต็มก้อน) คือการเติมข้อมูลลงท้ายให้ครบก้อน วิธีมาตรฐานที่ใช้กันมากชื่อ PKCS#7 เติมค่า 0C ซึ่งคือเลข 12 ลงไป 12 ครั้ง ผู้รับอ่าน byte สุดท้ายเจอ 0C ก็รู้ว่าต้องตัดทิ้ง 12 byte
block 1 message 16 byte
block 2 message 4 byte + 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0CECB กับ CBC ต้อง padding เพราะส่งต้นฉบับเข้า E ตรง ๆ ส่วน CFB, OFB และ CTR ไม่ต้อง เพราะตัด keystream ให้ยาวเท่าเศษที่เหลือได้เลย
คนมักคิดว่า เข้ารหัสด้วย AES แล้ว ข้อมูลไม่รั่วแน่นอน ซึ่งผิดถ้าเลือกโหมดผิด
ความเชื่อนี้ดูถูก เพราะ AES เองยังไม่มีใครเจาะได้จริง
แต่ ECB รั่วกับ AES เหมือนที่รั่วกับตัวอักษร ถ้าเอารูปภาพมาเข้ารหัสด้วย aes-256-ecb แล้วมองผลลัพธ์เป็นรูปอีกที รูปเดิมยังเห็นเป็นเงา เพราะพื้นที่สีเดียวกันคือก้อนที่เหมือนกัน ขอบวัตถุจึงยังอยู่ครบ
อัลกอริทึมไม่ได้ผิด โหมดต่างหากที่ผิด ข้อมูลรั่วผ่านการซ้ำ
ลอง ECB กับ CBC ด้วย AES จริง
พิมพ์ ABCDEFGHIJKLMNOP ซ้ำสองรอบให้เป็นสองก้อนที่เหมือนกัน แล้วเข้ารหัสแบบ ECB ส่วน -nopad ปิด padding เพราะข้อความยาวลงตัวพอดี
printf 'ABCDEFGHIJKLMNOP%.0s' 1 2 \
| openssl enc -aes-128-ecb -K 000102030405060708090a0b0c0d0e0f -nopad \
| xxd -p -c169cdd85de85b48bed892f02d8a5cbdacb
9cdd85de85b48bed892f02d8a5cbdacbสองก้อนออกมาเหมือนกันทุกตัว เปลี่ยน -aes-128-ecb เป็น -aes-128-cbc -iv 0f0e0d0c0b0a09080706050403020100 แล้วรันใหม่
e826d336a6931efe81530fad9bee86c6
c98437a8a92f2ef895faf7c5caa46ee7เทียบทุกโหมด
โหมดทั้งหมดต่างกันที่สี่เรื่อง คือ Initial Vector, Padding, Chaining และ Feedback ECB คือ Block to Block without feedback or IV ส่งทีละก้อนโดยไม่มีทั้งสองอย่าง คุณสมบัติส่วนใหญ่ในตารางนี้ไม่ได้อยู่ในสไลด์ เรียบเรียงเพิ่มไว้สำหรับทวน
ต่อสายยังไง
| โหมด | IV | Padding | ส่งอะไรต่อไปก้อนถัดไป |
|---|---|---|---|
| ECB | ไม่มี | ต้อง | ไม่มี |
| CBC | มี | ต้อง | ผลลัพธ์ (chaining) |
| PCBC | มี | ต้อง | ต้นฉบับกับผลลัพธ์ (chaining) |
| CFB | มี | ไม่ต้อง | ผลลัพธ์ (feedback) |
| OFB | มี | ไม่ต้อง | keystream (feedback) |
| CTR | nonce กับตัวนับ | ไม่ต้อง | ไม่มี |
| GCM | nonce กับตัวนับ | ไม่ต้อง | ไม่มี |
แล้วได้อะไรตามมา
| โหมด | ทำทุกก้อนพร้อมกันได้ | ผลลัพธ์เสีย 1 ก้อน ถอดแล้วเสียแค่ไหน | บอกได้ว่าถูกแก้ |
|---|---|---|---|
| ECB | ได้ | ก้อนนั้นก้อนเดียว | ไม่ได้ |
| CBC | ไม่ได้ | ก้อนนั้น และบิตที่ตรงกันในก้อนถัดไป | ไม่ได้ |
| PCBC | ไม่ได้ | ทุกก้อนจากตรงนั้นจนจบ | ไม่ได้ |
| CFB | ไม่ได้ | บิตที่ตรงกันในก้อนนั้น และก้อนถัดไปทั้งก้อน | ไม่ได้ |
| OFB | ไม่ได้ | เฉพาะบิตที่เสีย | ไม่ได้ |
| CTR | ได้ | เฉพาะบิตที่เสีย | ไม่ได้ |
| GCM | ได้ | ผู้รับปฏิเสธทั้งข้อความ | ได้ |
ลองตอบดู: ต้องเข้ารหัสไฟล์วิดีโอขนาด 4 GB บนเครื่อง 8 core ให้เร็วที่สุด และผู้รับต้องรู้ได้ถ้ามีคนแก้ไฟล์ระหว่างทาง ควรใช้โหมดไหน
ไล่ทีละเงื่อนไขจากตาราง เร็วบนหลาย core แปลว่าต้องเข้ารหัสทุกก้อนพร้อมกันได้ เหลือ ECB, CTR และ GCM ECB ตัดทิ้งเพราะลายของต้นฉบับหลุด ส่วนการรู้ว่าถูกแก้ มีแต่ GCM ที่ทำได้
คำตอบคือ GCM
คำตอบที่ผิดบ่อยคือ CTR ซึ่งเร็วพอ แต่ให้แค่ความลับ คนที่พลิกบิตในผลลัพธ์จะพลิกบิตเดียวกันในต้นฉบับได้โดยผู้รับไม่รู้ตัว
ส่วนที่ 8 — Public Key: กุญแจคนละดอก
ปัญหาที่กุญแจเดียวแก้ไม่ได้
โจทย์คือ อาจารย์คนหนึ่งต้องการแชร์ข้อมูลกับนิสิต 100 คน ต้องใช้กุญแจแบบสมมาตรกี่ดอก ถ้าต้องการพิสูจน์ integrity ของข้อมูล คือพิสูจน์ว่าเอกสารนี้อาจารย์เป็นคนสร้าง และมีแต่อาจารย์เท่านั้นที่สร้างได้
คำใบ้คือ ถ้ามีกุญแจดอกเดียว ใครก็ตามที่มีกุญแจนั้นก็เขียนข้อความได้
ลองตอบดู: ต้องใช้กี่ดอก และทำไม
เหตุผลอยู่ในคำใบ้ ถ้าใช้ดอกเดียวร่วมกันทั้งชั้น นิสิตคนที่ 47 ก็สร้างเอกสารที่ดูเหมือนมาจากอาจารย์ได้ เพราะเขามีกุญแจดอกเดียวกัน จึงพิสูจน์ไม่ได้ว่าใครเป็นคนเขียน
ต้องแยกดอกต่อคน กุญแจดอกที่ 47 มีแค่อาจารย์กับนิสิตคนที่ 47 ที่ถือ นิสิตคนที่ 47 จึงรู้ว่าข้อความที่เปิดด้วยดอกนี้ได้ต้องมาจากอาจารย์ เพราะอีกคนเดียวที่ถือดอกนี้คือตัวเขาเอง
คำตอบคือ 100 ดอก คือดอกละคน
คำตอบที่ผิดบ่อยคือ 1 ดอก ซึ่งพอสำหรับเก็บความลับจากคนนอกชั้น แต่พิสูจน์ไม่ได้ว่าใครในชั้นเป็นคนเขียน
คำตอบ 100 ดอกย้ายปัญหาไปที่อื่น ไม่ได้ทำให้มันหายไป
- อาจารย์ต้องเก็บกุญแจ 100 ดอก และต้องส่งกุญแจแต่ละดอกถึงเจ้าของอย่างปลอดภัยด้วย
- ถ้าให้นิสิตคุยกันเองทุกคู่ จำนวนกุญแจจะกลายเป็น
100 × 99 ÷ 2เท่ากับ 4,950 ดอก - แต่ละดอกที่หลุด คือช่องทางหนึ่งช่องที่ถูกยึด
นี่คือ ปัญหาเรื่องขนาด ของการเข้ารหัสแบบสมมาตร และเป็นเหตุผลที่ส่วนถัดไปต้องมีอยู่
Asymmetric Encryption (การเข้ารหัสแบบกุญแจไม่สมมาตร) หรือที่เรียกกันว่า Public Key แก้ปัญหาข้างบนด้วยการเลิกใช้กุญแจดอกเดียว
หลักการมีสองข้อ
- สร้างจากจำนวนเฉพาะ ได้ออกมาเป็นกุญแจหนึ่งคู่ คือ Private Key (กุญแจส่วนตัว) กับ Public Key (กุญแจสาธารณะ)
- ข้อความที่ล็อกด้วย private key เปิดได้ด้วย public key ของคู่นั้นเท่านั้น และในทางกลับกันก็เช่นกัน
ผลที่ได้คือ เราเก็บแค่ private key ส่วน public key แจกได้อย่างอิสระ เช่นเอาไปแปะไว้บนหน้าเว็บส่วนตัว
แต่ยังมีปัญหาค้างอยู่หนึ่งข้อ — ยังไม่มีอะไรยืนยันตัวตนจริง ๆ ของเจ้าของ public key
ปัญหานี้ฟังดูเล็กแต่ใหญ่มาก
ใครก็สร้างกุญแจคู่หนึ่งขึ้นมา แล้วประกาศว่า public key ดอกนี้เป็นของธนาคารได้ ตัวกุญแจไม่มีชื่อเจ้าของเขียนอยู่ในตัวมันเอง มันเป็นแค่ตัวเลขก้อนหนึ่ง
การเข้ารหัสจึงย้ายปัญหาความไว้ใจ ไม่ได้ลบมันทิ้ง เดิมต้องส่งกุญแจลับให้ถึงมืออีกฝ่ายอย่างปลอดภัย ตอนนี้ต้องรู้ให้ได้ว่า public key ดอกนี้เป็นของใครจริง
สิ่งที่มาแก้ข้อนี้คือ certificate ซึ่งบทนี้บอกไว้ว่าจะกลับมาพูดถึงในเรื่อง PKI (Public Key Infrastructure ระบบที่รับรองว่า public key เป็นของใคร) ทีหลัง
ล็อกสองชั้นให้ได้ทั้งความลับและการพิสูจน์ตัวตน
โจทย์คือ Bob อยากส่งข้อความหา Alice โดยที่มีแต่ Alice ที่อ่านได้ และ Alice พิสูจน์ได้ว่าข้อความมาจาก Bob จะทำยังไง
ลองทายก่อน: แบบ A ((message)Bob's Priv)Alice's Pub กับแบบ B ((message)Alice's Pub)Bob's Priv ใช้กุญแจสี่ดอกเดียวกัน ต่างกันแค่ลำดับ แบบไหนปลอดภัยกว่า
แบบ B — ((message)Alice's Pub)Bob's Priv
ล็อกด้วย public key ของ Alice ก่อน แล้วค่อยล็อกทับด้วย private key ของ Bob
ชั้นนอกสุดคือลายเซ็นของ Bob ซึ่ง ใครก็แกะออกได้ เพราะ public key ของ Bob เป็นของสาธารณะ
ผลที่ตามมาคือมีคนดักกลางระหว่างทาง ลอกลายเซ็นของ Bob ทิ้ง แล้วเซ็นทับด้วย private key ของตัวเอง จากนั้นส่งต่อให้ Alice ได้
Alice จะแกะออกมาแล้วอ่านข้อความได้ตามปกติ แต่เชื่อว่าข้อความมาจากคนดักกลาง ทั้งที่คนคนนั้นไม่เคยอ่านข้อความนั้นเลยสักครั้ง
แบบ A — ((message)Bob's Priv)Alice's Pub
เซ็นด้วย private key ของ Bob ก่อน แล้วค่อยล็อกทับด้วย public key ของ Alice
ชั้นนอกสุดคือชั้นที่มีแต่ Alice เปิดได้ ลายเซ็นของ Bob จึงถูกห่ออยู่ข้างใน คนที่ไม่ใช่ Alice แตะมันไม่ได้เลย
Alice เปิดชั้นนอกด้วย private key ของตัวเอง แล้วเจอลายเซ็นของ Bob ข้างใน ซึ่งตรวจได้ว่าเป็นของ Bob จริง
ได้ครบทั้งสองข้อ คือความลับจากชั้นนอก และการพิสูจน์ต้นทางจากชั้นใน
หลักที่จำง่ายคือ เซ็นก่อน แล้วค่อยปิดผนึก
เหมือนจดหมาย กระดาษที่เซ็นชื่อคือชั้น Bob's Priv และซองคือชั้น Alice's Pub เซ็นชื่อบนกระดาษแล้วค่อยใส่ซอง ไม่ใช่ใส่ซองแล้วเซ็นบนซอง เพราะซองถูกเปลี่ยนได้
อุปมานี้ใช้ไม่ได้ตรงที่ ซองจริงใครก็ฉีกอ่านได้ แต่ชั้น Alice's Pub มีแต่ Alice ที่เปิดได้
ลองตอบดู: Alice อยากประกาศข่าวให้ทุกคนอ่านได้ และให้ทุกคนตรวจได้ว่าข่าวมาจาก Alice จริง ต้องล็อกข่าวด้วยกุญแจดอกไหน
ดอกที่ล็อกต้องเป็นดอกที่มีแต่ Alice ถือ คนอื่นจึงสร้างข้อความแบบนี้ไม่ได้ และดอกที่ใช้เปิดต้องเป็นดอกที่ทุกคนมี ทุกคนจึงอ่านและตรวจได้
คำตอบคือ private key ของ Alice แล้วทุกคนเปิดด้วย public key ของ Alice
คำตอบที่ผิดบ่อยคือ public key ของ Alice ซึ่งกลับทิศ ใครก็ล็อกด้วย public key ได้ จึงพิสูจน์ไม่ได้ว่าใครเขียน และมีแต่ Alice ที่เปิดอ่านได้ ซึ่งตรงข้ามกับที่ต้องการ
ราคาที่ต้องจ่าย
เรียงความเร็วจากช้าไปเร็ว Public Key ช้าที่สุด เพราะทำงานด้วยฟังก์ชันเลขยกกำลัง block cipher กับ stream cipher เร็วกว่า เพราะทำงานด้วยฟังก์ชันตรรกะ และ hash เร็วที่สุด
ลำดับนี้คือเหตุผลที่ของจริงใช้ public key กับของชิ้นเล็กที่สุดเท่านั้น แล้วให้ตัวที่เร็วกว่ารับงานหนัก ซึ่งส่วนที่ 10 จะดูว่าต่อกันยังไง
ส่วนที่ 9 — การเข้ารหัสให้อะไร และไม่ให้อะไร
สรุปว่าการเข้ารหัสให้อะไรกับเราบ้าง
คำตอบมีสามข้อ และข้อสุดท้ายสำคัญที่สุด
- ถ้าจัดการกุญแจดี การเข้ารหัสให้ได้ทั้ง authentication และ authorization
- สำหรับ authorization มันให้ได้ทั้ง confidentiality และ integrity
- แต่การเข้ารหัสมีจุดอ่อนต่อการวิเคราะห์ทางสถิติ และถ้ามีกำลังประมวลผลมากพอ ทุกอย่างถูกเจาะได้
สองข้อแรกอธิบายได้ด้วยกรณีที่เจอมาแล้ว ลายเซ็นในส่วนที่ 8 บอกได้ว่าใครเป็นคนเขียน นั่นคือ authentication ส่วน authorization เกิดจากการที่ การถือกุญแจกลายเป็นสิทธิ์ คนที่มีสิทธิ์อ่านคือคนที่ถือดอกที่เปิดได้ ซึ่งคือ confidentiality ใน Lecture 4 และคนที่มีสิทธิ์สร้างข้อความที่ถูกต้องคือคนที่ถือดอกที่ใช้เขียน เช่นกุญแจของอาจารย์ในโจทย์นิสิต 100 คน ซึ่งคือ integrity ย่อหน้านี้เป็นคำอธิบายเสริม
คนส่วนใหญ่คิดว่าการเข้ารหัสปลอดภัย ซึ่งประโยคสุดท้ายข้างบนบอกว่าไม่จริงเสมอไป
ความเชื่อนี้ดูถูก เพราะวันนี้คนที่ไม่มีกุญแจเปิดข้อความที่เข้ารหัสดีแล้วไม่ออกจริง ๆ
แต่การเข้ารหัสไม่ได้ทำให้ข้อความอ่านไม่ได้ มันทำให้ข้อความ อ่านไม่คุ้ม ในกรอบเวลาที่มีความหมาย
เงื่อนไขคำว่าคุ้มเปลี่ยนได้ตลอด เพราะกำลังประมวลผลเพิ่มขึ้นทุกปี ของที่เข้ารหัสวันนี้แล้วถูกเก็บไว้ อาจถูกเปิดอ่านได้ในสิบปีข้างหน้า
และนี่คือเหตุผลที่หัวข้อถัดไปต้องมี
ความท้าทายของยุคนี้
ภัยที่มามีสี่อย่าง
- Quantum Computing
- Machine Learning Attacks
- Side-Channel Attacks
- กำลังประมวลผลที่เพิ่มขึ้น
ส่วนงานวิจัยที่รับมือมีสองทาง ซึ่งไม่ได้จับคู่กับภัยข้อใดข้อหนึ่ง
- Post-Quantum Cryptography
- Blockchain Technologies ?
Quantum Computing โจมตี คณิตศาสตร์ ที่อยู่ใต้ public key คือทำให้การแยกตัวประกอบจำนวนเฉพาะ ซึ่งเป็นฐานของ RSA และ discrete logarithm ซึ่งเป็นฐานของ DSA แก้ได้เร็วขึ้นมาก จึงกระทบทั้งสองตัวโดยตรง แต่กระทบ hash และ symmetric น้อยกว่ามาก
Side-Channel Attacks ไม่โจมตีอัลกอริทึมเลย แต่ดู ร่องรอยที่การทำงานทิ้งไว้ เช่นเวลาที่ใช้ ไฟที่กิน หรือเสียงที่เกิด แล้วเดากุญแจจากตรงนั้น อัลกอริทึมที่พิสูจน์แล้วว่าแข็งแรงก็ยังแพ้ทางนี้ได้ถ้าเขียนโค้ดไม่ระวัง
Machine Learning Attacks ใช้โมเดลหาแบบแผนในผลลัพธ์ที่ควรจะดูเหมือนสุ่ม ซึ่งเป็นการวิเคราะห์ทางสถิติในรูปแบบที่แรงกว่าเดิมมาก
Post-Quantum Cryptography คืออัลกอริทึม public key ชุดใหม่ ที่สร้างบนโจทย์คณิตศาสตร์ซึ่งเชื่อว่าคอมพิวเตอร์ควอนตัมก็แก้ได้ไม่เร็ว
Blockchain คือบันทึกที่แต่ละก้อนเก็บค่า hash ของก้อนก่อนหน้า ถ้าแก้ก้อนเก่า hash ที่ก้อนหลังจากนั้นเก็บไว้จะไม่ตรงกันทันที จึงเกี่ยวกับ integrity ตรง ๆ
เครื่องหมายคำถามหลัง Blockchain เป็นของบทนี้เอง กล่องนี้เป็นคำอธิบายเสริม
ภัยที่เปลี่ยนตลอดทำให้ cryptography เป็นสาขาที่ dynamic และพัฒนาไม่หยุด เป็น ส่วนผสมของคณิตศาสตร์ วิทยาการคอมพิวเตอร์ และความปลอดภัย ซึ่ง สำคัญต่อความปลอดภัยดิจิทัลยุคนี้ และ ต้องเรียนรู้ต่อเนื่อง ทางเรียนต่อที่แนะนำคือ เข้าใจหลักพื้นฐาน ลองลงมือ implement ติดตามเทคโนโลยีที่เกิดใหม่ และฝึกคิดวิเคราะห์
ส่วนที่ 10 — Security Protocol: เอาหลายอย่างมาต่อกัน
ส่วนที่ 5 ถึง 8 ให้เครื่องมือมาสามชิ้น และแต่ละชิ้นเก่งคนละอย่าง
- Hash เร็วที่สุด แต่ส่งความลับไม่ได้ และไม่รู้ว่าใครเป็นคนย่อย
- Symmetric เร็ว แต่ต้องส่งกุญแจถึงกันก่อน และไม่บอกว่าใครเป็นคนเขียน
- Public Key แจกกุญแจง่ายและบอกได้ว่าใครเขียน แต่ช้าที่สุด
ไม่มีชิ้นไหนใช้เดี่ยว ๆ แล้วพอ ของจริงจึงเป็นการต่อกัน โดยให้แต่ละชิ้นทำเฉพาะสิ่งที่มันเก่ง
Security Protocol (พิธีการความปลอดภัย) คือ การเอาอัลกอริทึมหลายตัวมารวมกัน โดยรวมข้อดีและข้อเสียของแต่ละตัวเข้าด้วยกัน
Digital Signature
กลับไปที่โจทย์อาจารย์กับนิสิต 100 คนในส่วนที่ 8 ด้วยกุญแจแบบสมมาตร ต้องมี 100 ดอก และทุกดอกต้องส่งถึงมือแต่ละคนอย่างปลอดภัย ด้วยเครื่องมือในหัวข้อนี้ อาจารย์มีกุญแจคู่เดียว เซ็นเอกสารหนึ่งครั้ง แล้วแปะ public key ไว้บนหน้าเว็บ
นิสิตกี่คนก็ตรวจได้ ไม่ว่าจะ 100 หรือ 100,000 คน โดยอาจารย์ไม่ต้องทำอะไรเพิ่มเลย และไม่มีนิสิตคนไหนปลอมลายเซ็นได้ เพราะไม่มีใครมี private key ของอาจารย์
Digital Signature (ลายเซ็นดิจิทัล) ทำแบบนั้นได้ด้วยการย่อข้อความด้วย hash แล้วล็อกค่าย่อยด้วย private key มีคุณสมบัติสองข้อ
- ผู้รับตรวจสอบความเป็นต้นฉบับของข้อความธรรมดาได้
- รวมความเร็วของ message digest เข้ากับความยืดหยุ่นเรื่องจำนวนของ public key
คนมักคิดว่า ข้อความที่มีลายเซ็นดิจิทัลถูกเข้ารหัสแล้ว คนอื่นอ่านไม่ได้ ซึ่งไม่จริง
ความเชื่อนี้ดูถูก เพราะการเซ็นคือการล็อกด้วย private key ซึ่งฟังเหมือนการเข้ารหัส แต่ของที่ถูกล็อกคือค่าย่อย และดอกที่เปิดคือ public key ซึ่งใครก็มี
ลายเซ็นดิจิทัล ไม่ได้ปิดบังข้อความ ในรูปที่ 9 ข้อความเดินทางไปพร้อมลายเซ็นเป็นข้อความธรรมดาที่ใครดักอ่านก็อ่านออก ที่มันรับประกันคือข้อความไม่ถูกแก้ และคนเซ็นเป็นเจ้าของ private key จริง
ถ้าต้องการปิดบังด้วย ต้องห่อชั้นนอกเพิ่มอีกชั้น ซึ่งก็คือแบบ A ในส่วนที่ 8
HTTPS, SSL และ TLS
TLS (Transport Layer Security) คือ security protocol ที่เข้ารหัสการเชื่อมต่อบนเครือข่าย เป็นรุ่นต่อจาก SSL (Secure Sockets Layer) และ HTTPS (HTTP ที่วิ่งบน TLS) คือการเปิดหน้าเว็บผ่าน TLS ประโยคนี้เป็นข้อมูลเสริม
จุดสำคัญมีสามข้อ
- ไคลเอนต์เป็นคนเลือกว่าจะใช้ stream หรือ block cipher ตัวไหนพร้อมกุญแจ ขึ้นกับสภาพแวดล้อม
- มีแต่เซิร์ฟเวอร์ที่ถือ private key จึงมีแต่ไคลเอนต์กับเซิร์ฟเวอร์ที่รู้กุญแจสมมาตรดอกนั้น
- รวมความเร็วของกุญแจสมมาตร เข้ากับความยืดหยุ่นเรื่องจำนวนของ public key
สังเกตว่าลำดับนี้เป็นคำตอบของทุกข้อจำกัดที่สะสมมาตั้งแต่ส่วนที่ 6
ปัญหาจำนวนกุญแจ หายไป เพราะเซิร์ฟเวอร์มีกุญแจคู่เดียวสำหรับผู้ใช้ทุกคนในโลก
ปัญหาการส่งกุญแจ หายไป เพราะกุญแจสมมาตรถูกสุ่มขึ้นใหม่ต่อการเชื่อมต่อ แล้วส่งไปในซองที่มีแต่เซิร์ฟเวอร์เปิดได้
ปัญหาความช้า หายไป เพราะ public key ถูกใช้แค่ครั้งเดียวกับของชิ้นเล็ก คือกุญแจหนึ่งดอก ส่วนข้อมูลจริงทั้งหมดวิ่งด้วยกุญแจสมมาตรที่เร็วกว่า
สิ่งเดียวที่ยังค้างคือจังหวะที่ 2 — เราจะรู้ได้ยังไงว่า public key ที่ส่งมานั้นเป็นของ chula.ac.th จริง นั่นคืองานของ certificate ซึ่งบทนี้ยกไปพูดในเรื่อง PKI
ลองตอบดู: มีคนดักเก็บแพ็กเก็ตทุกตัวของการเชื่อมต่อ HTTPS ตามรูปที่ 10 ไว้ครบ รวมถึง public key และ certificate ในจังหวะที่ 2 เขาอ่านข้อมูลที่รับส่งกันได้ไหม
ข้อมูลทั้งหมดถูกล็อกด้วยกุญแจสมมาตร และกุญแจดอกนั้นเดินทางในจังหวะที่ 3 โดยถูกล็อกด้วย public key ของเซิร์ฟเวอร์ ดอกที่เปิดได้คือ private key ซึ่งอยู่แค่ที่เซิร์ฟเวอร์
คำตอบคือ อ่านไม่ได้ ตราบใดที่ private key ของเซิร์ฟเวอร์ไม่หลุด
คำตอบที่ผิดบ่อยคือ "อ่านได้ เพราะเห็น public key แล้ว" แต่ public key เปิดสิ่งที่ล็อกด้วย public key ไม่ได้ ส่วนเงื่อนไข "ไม่หลุด" สำคัญ ถ้าวันหนึ่ง private key หลุด ข้อมูลที่ดักเก็บไว้ในแบบที่รูปนี้วาดจะถูกเปิดได้ย้อนหลังทั้งหมด ซึ่งเป็นกรณีเดียวกับของที่เข้ารหัสวันนี้แล้วถูกเปิดได้ในอนาคตในส่วนที่ 9
ข้อสรุปเรื่อง integrity
- Integrity ต้องการอย่างใดอย่างหนึ่ง คือฮาร์ดแวร์หนุน หรือการเข้ารหัส
- ฮาร์ดแวร์บวกระบบปฏิบัติการรวมกัน เป็นฐานของ integrity ซึ่งก็คือฐานของความปลอดภัย
- กล่องที่มี integrity แข็งแรง แปลว่ามันเก็บของข้างในไว้ในสภาพเดิมได้เป็นปี ๆ
- ไม่มี integrity ที่สมบูรณ์แบบ ส่วนใหญ่แล้วการถูกเจาะระบบก็คือการที่ integrity แตก เช่นขโมยทุบกระจกแล้วเข้าไปในบ้าน
บ้านที่ขโมยทุบกระจกเข้าไปคือระบบที่ integrity แตก ตัวบ้านคือระบบ และกระจกคือส่วนของระบบที่ต้องคงสภาพเดิม
บ้านหลังนั้นมี authentication คือกุญแจประตู มี authorization คือใครเข้าห้องไหนได้ มี auditing คือกล้องวงจรปิด
แต่ขโมยไม่ได้ผ่านประตู เขาเปลี่ยนรูปร่างของตัวบ้าน กระจกที่เคยเป็นแผ่นเดียวกลายเป็นช่องทางเข้า
ทั้งสามระบบข้างบนยังทำงานปกติทุกอย่าง มันแค่ไม่เกี่ยวข้องอีกต่อไป เพราะสิ่งที่มันเฝ้าอยู่ไม่ใช่เส้นทางที่ถูกใช้
อุปมานี้ใช้ไม่ได้ตรงที่ กระจกแตกเห็นได้ทันทีด้วยตา แต่ไฟล์ที่ถูกแก้หน้าตาเหมือนเดิมทุกอย่าง ต้องมี hash หรือลายเซ็นดิจิทัลถึงจะรู้ว่ามันไม่ใช่ชิ้นเดิม
สิ่งที่บทนี้ยังไม่ได้พูด
บทนี้บอกไว้เองว่ามีสี่เรื่องที่ยังไม่ได้ลง
- Key management คือการสร้าง แจก เก็บ เปลี่ยน และยกเลิกกุญแจ ซึ่งจะกลับมาในเรื่อง PKI
- การหา collision ของฟังก์ชัน hash ได้จริง โดยมีตัวอย่างจริงที่ MD5 collision demo
- Post-Quantum Encryption
- Elliptic-curve cryptography คือ public key ที่สร้างจากเส้นโค้งวงรี ได้ความแข็งแรงเท่า RSA ด้วยกุญแจที่สั้นกว่ามาก
คำอธิบายต่อท้าย key management กับ elliptic-curve cryptography เป็นข้อมูลเสริม
รายชื่ออัลกอริทึมที่ต้องแยกให้ออก
| กลุ่ม | ชื่อ | หมายเหตุ |
|---|---|---|
| Hash / Digest | MD5, SHA-1, SHA-256, SHA-512 | ทางเดียว ความยาวคงที่ MD5 กับ SHA-1 หา collision ได้แล้ว |
| Tiger-Hash | hash ที่ออกแบบมาให้เร็วบนเครื่อง 64 บิต | |
| Stream Cipher | RC4, CHACHA, SEAL | ทำทีละบิตหรือทีละตัวอักษร RC4 เคยอยู่ใน SSL, WEP, WPA |
| Block Cipher | Blowfish, DES, 3DES, AES | ทำทีละก้อน DES คือมาตรฐานเก่าที่กุญแจยาว 56 บิต สั้นจนลองหมดทุกค่าได้แล้ว 3DES คือการเอา DES มาทำซ้ำสามรอบเพื่อยืดอายุการใช้งาน Blowfish คือ block cipher ก้อนละ 64 บิตที่ออกแบบมาใช้แทน DES |
| Public Key | RSA, DSA | สร้างจากจำนวนเฉพาะ ช้าที่สุดในสามกลุ่ม DSA ใช้เซ็นอย่างเดียว ไม่ใช้ปิดความลับ |
Tiger-Hash, CHACHA, SEAL, Blowfish, DES, 3DES และ DSA ปรากฏเป็นชื่อในรายการโดยไม่มีคำอธิบายต่อ คอลัมน์หมายเหตุของเจ็ดตัวนี้ และเรื่องที่ MD5 กับ SHA-1 หา collision ได้แล้ว จึงเป็นข้อมูลเสริม เขียนไว้ให้พอแยกออกว่าแต่ละตัวอยู่กลุ่มไหนและต่างจากเพื่อนในกลุ่มยังไง
- Integrity คือสภาพของการเป็น whole, complete, unbroken, undivided กับคน และ unified and unimpaired กับข้อมูล
- บางครั้งเรียกว่า Authenticity จึงถูกนับเป็น A ตัวที่สี่ ต่อจาก Authentication, Authorization, Auditing
- คำถามหลักของบท: How can we preserve the integrity of data? และคำตอบคือ integrity ต้องมีฮาร์ดแวร์หนุน
- Trust คือ ฐานของทุกโมเดลความปลอดภัย — ไว้ใจตัวประมวลผล ผู้ใช้ หรือซอฟต์แวร์
- ระบบที่ไว้ใจทุกอย่าง: ระบบผู้ใช้เดียวไม่มีการป้องกัน (DOS, CP/M,
Windows < NT), ระบบฝังตัว, มือถือรุ่นเก่า - ลดความไว้ใจด้วยขอบเขต — Sandbox และ Domains (isolation)
- Sandbox มาจาก Java Applet ตัดสินใจด้วย code signing ไว้ใจแล้วรันสิทธิ์เต็ม ไม่ไว้ใจก็ถูกจำกัด
- ข้อสรุปของหัวข้อนี้คือ Trust ≠ Secure
- สองกลุ่ม: electronic curtain ผ่าน Ring ที่แบ่งด้วย segmentation หรือ page และ tagged memory
- Ring มาจาก Multics (1960) วงในเข้าวงนอกได้ วงนอกเข้าวงในได้ทางเดียวคือ system call
- Intel x86 มี 4 ring ระบบปฏิบัติการส่วนใหญ่ใช้แค่ 0 กับ 3 · IBM OS/2 น่าจะเป็นตัวเดียวที่วาง device driver ไว้ที่ ring 1 และ 2
- บานพับของบท: ข้อมูลในแฟลชไดรฟ์ อีเมล และแพ็กเก็ต ไม่ได้มีฮาร์ดแวร์คุ้มครองเสมอไป
- Scytale กรีก 500 ปีก่อนคริสตกาล เป็น transposition cipher ใช้แท่งไม้กับแถบหนัง
- Monoalphabetic substitution ที่ Julius Caesar (50 BC) ใช้ —
YRFFJ VJMFUคือhello world - จุดที่แตก: ถ้าข้อความยาวพอ นับความถี่ตัวอักษรแล้วแกะได้
- one-way function ไม่มีฟังก์ชันผกผัน · เข้ายาวเท่าไหร่ก็ได้ ออก ยาวคงที่ · มี collision แน่นอนเพราะของไม่จำกัดลงช่องจำกัด
- ใช้ตรวจ integrity เช่นยืนยันไฟล์จาก mirror site
- ถอดกลับไม่ได้ จึงบางทีไม่ถูกนับเป็นการเข้ารหัส
- Stream cipher — Vigenère (1467) ยืดกุญแจให้ยาวเท่าข้อมูล
LUCKYLUCK+COMPUTINGได้NIOZSECPQ· ตัวจริงคือ RC4 ใน SSL, WEP, WPA - Block cipher — Wheatstone-Playfair (1854) ใช้หนักใน WWII ตาราง 5 × 5 จับคู่แล้วใช้มุม
CO MP UT ERได้OW EO ZD GE - ทั้งสองแบบแก้ปัญหาเดียวกัน คือ ตัวอักษรเดียวกันต้องเข้ารหัสออกมาไม่เหมือนกัน
- Mode of operation คือวิธีหั่นข้อความเป็นก้อนแล้วส่งเข้า block cipher ต่างกันที่ IV, padding, chaining, feedback
- ECB ส่งแต่ละก้อนเข้า E แยกกัน ก้อนซ้ำได้ผลซ้ำ ลายเดิมยังอยู่ ก้อนละตัวอักษรก็คือรหัสแทนที่ตัวอักษร
hello→YRFFJ - CBC บวกต้นฉบับกับ ผลลัพธ์ก้อนก่อนหน้า แล้วเข้า E ก้อนแรกใช้ IV ซึ่งต้องสุ่มใหม่ทุกครั้ง · PCBC ผสมทั้งต้นฉบับและผลลัพธ์ ความเสียหายลามจนจบ
- CFB / OFB ให้ E ผลิต keystream มาบวกกับต้นฉบับ = ใช้ block cipher เป็น stream cipher · CFB วนผลลัพธ์กลับ OFB วน keystream กลับ
- CTR ส่ง nonce + ตัวนับ เข้า E ไม่ต้องรอก้อนก่อนหน้า ทำพร้อมกันได้ · ห้ามใช้ nonce ซ้ำกับกุญแจเดิม · GCM คือ CTR ที่ตรวจได้ว่าข้อมูลถูกแก้
- AES ก้อนละ 16 byte กุญแจ AES-128 ยาว 16 byte · ผสมด้วย XOR แทนการบวกตัวอักษร · ECB กับ CBC ต้อง padding ก้อนสุดท้าย
- ปัญหาเรื่องขนาด: อาจารย์กับนิสิต 100 คนต้องใช้ 100 ดอก เพราะกุญแจดอกเดียวแปลว่าใครก็เขียนแทนได้
- สร้างจากจำนวนเฉพาะ ได้กุญแจหนึ่งคู่ ล็อกด้วยดอกหนึ่ง เปิดด้วยอีกดอก
- เก็บแค่ private key ส่วน public key แจกได้ แต่ ยังไม่มีอะไรยืนยันตัวตนของเจ้าของ public key ซึ่งเป็นงานของ certificate
- โจทย์ Bob กับ Alice: เซ็นก่อนแล้วค่อยปิดผนึก คือ
((message)Bob's Priv)Alice's Pub - ความเร็ว: public key ช้าที่สุด เพราะใช้เลขยกกำลัง · block/stream เร็วกว่า เพราะใช้ตรรกะ · hash เร็วที่สุด
- ถ้าจัดการกุญแจดี ได้ทั้ง authentication และ authorization แต่ อ่อนต่อการวิเคราะห์ทางสถิติ และกำลังประมวลผลที่มากพอเจาะได้ทุกอย่าง
- ความท้าทายยุคนี้: quantum computing, machine learning attacks, side-channel attacks, กำลังประมวลผลที่เพิ่มขึ้น และงานวิจัยฝั่งรับคือ post-quantum cryptography กับ blockchain?
- cryptography เป็นสาขาที่ dynamic ผสมคณิตศาสตร์ วิทยาการคอมพิวเตอร์ และความปลอดภัย จึง ต้องเรียนรู้ต่อเนื่อง
- คือ การรวมอัลกอริทึมหลายตัวเข้าด้วยกัน เพื่อรวมข้อดีและข้อเสีย
- Digital signature — ผู้รับตรวจความเป็นต้นฉบับของ ข้อความธรรมดา ได้ รวม ความเร็วของ message digest กับ ความยืดหยุ่นเรื่องจำนวนของ public key และ ไม่ได้ปิดบังข้อความ
- HTTPS/SSL/TLS — ขอหน้าเว็บ, รับ public key กับ certificate, ส่งกุญแจสมมาตรที่ล็อกด้วย public key ของเซิร์ฟเวอร์, แล้วรับส่งข้อมูลด้วยกุญแจดอกนั้น
- มีแต่เซิร์ฟเวอร์ที่ถือ private key จึงมีแค่สองฝั่งที่รู้กุญแจสมมาตร
- Integrity ต้องการฮาร์ดแวร์หนุน หรือการเข้ารหัส อย่างใดอย่างหนึ่ง
- ฮาร์ดแวร์บวกระบบปฏิบัติการคือฐานของ integrity ซึ่งคือฐานของความปลอดภัย
- กล่องที่ integrity แข็งแรง เก็บของข้างในไว้ในสภาพเดิมได้เป็นปี ๆ
- ไม่มี integrity ที่สมบูรณ์แบบ การถูกเจาะระบบส่วนใหญ่คือการที่ integrity แตก
- เรื่องที่ยังไม่ได้ลง: key management (ไปต่อที่ PKI), การหา collision ของ hash ได้จริง, post-quantum encryption, elliptic-curve cryptography