ข้ามไปที่เนื้อหา
CEDTAN

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 เริ่มจากโค้ดหนึ่งชิ้นที่เราไม่ไว้ใจ แล้วล้อมกรอบรอบมัน ข้างในกรอบทำอะไรก็ได้ ข้างนอกกรอบห้ามแตะ

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

หน่วยความจำถูกแบ่งเป็นช่อง แต่ละช่องผูกกับวงแหวนหนึ่งวงring 3ring 2ring 1ring 0ขาเข้า มีประตูเดียวring 3 เรียก ring 0 ได้ผ่าน system call เท่านั้นเรียกตรงไม่ได้ ตัวประมวลผลจะขัดขึ้นมาเองขาออก ผ่านได้ตลอดring 0 อ่านเขียนของ ring 3 ได้ตรง ๆring 0 คือ kernel ส่วน ring 3 คือโปรแกรมของผู้ใช้
รูปที่ 1: ชั้นในเข้าถึงชั้นนอกได้ตรง ๆ ชั้นนอกเข้าชั้นในได้ทางเดียว

Electronic Curtain (ม่านไฟฟ้า) คือเส้นแบ่งที่ตัวประมวลผลขีดไว้ในหน่วยความจำ โค้ดฝั่งนอกข้ามไปฝั่งในเองไม่ได้ (นิยามนี้เป็นคำอธิบายเสริม) วิธีทำม่านนี้คือ Ring (วงแหวนระดับสิทธิ์)

Ring เป็นที่รู้จักขึ้นมาจาก Multics ในปี 1960

หลักการมีสามข้อ

  • ตัวประมวลผลแบ่งหน่วยความจำเป็นช่อง แล้ว ผูกแต่ละช่องไว้กับวงแหวนหนึ่งวง
  • แบ่งช่องได้สองแบบคือ Segmentation (การแบ่งเป็นส่วนตามความหมาย) และ Page (การแบ่งเป็นหน้าขนาดเท่ากัน)
  • วงในเข้าถึงวงนอกได้ แต่ วงนอกเข้าวงในได้ทางเดียวคือผ่านวิธีที่กำหนดไว้ ซึ่งก็คือ System Call (คำขอให้ระบบปฏิบัติการทำงานแทน)

ในระบบปฏิบัติการส่วนใหญ่ วงในสุดคือ ring 0 เป็นที่อยู่ของ Kernel (แกนของระบบปฏิบัติการ) และ Device Driver (โค้ดที่คุมอุปกรณ์) ส่วนโปรแกรมทั่วไปอยู่วงนอก system call คือคำขอที่โปรแกรมส่งให้ kernel ทำงานแทน เช่นเขียนไฟล์ลงดิสก์ ย่อหน้านี้เป็นคำอธิบายเสริม

Segmentation กับ Page แบ่งช่องคนละวิธี

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 จึงต้องเดินทางไปกับตัวข้อมูลเอง แทนที่จะฝากไว้กับเครื่องที่มันเคยอยู่ และเครื่องมือที่ทำแบบนั้นได้คือการเข้ารหัส

Physical Tamper Resistance ถูกตั้งเป็นหัวข้อไว้ แต่ไม่มีเนื้อหาต่อ

หัวข้อ Hardware Integrity ในบทนี้ประกาศไว้ว่าจะพูดเรื่อง Physical Tamper Resistance คือการทำให้อุปกรณ์ทนต่อการงัดแงะทางกายภาพ แต่บทนี้ไม่ได้ลงรายละเอียดต่อ

โดยย่อคือการออกแบบให้ตัวเครื่อง ลบความลับของตัวเองทิ้งเมื่อถูกเปิด ตัวอย่างที่เห็นได้คือชิปในบัตรเครดิต โมดูลฮาร์ดแวร์ที่เก็บกุญแจ และเครื่อง ATM ซึ่งมีเซ็นเซอร์ตรวจแรงดัน อุณหภูมิ และแสง ถ้ามีคนพยายามแกะ กุญแจข้างในจะถูกล้างก่อนที่ใครจะอ่านได้

ย่อหน้าที่สองเป็นคำอธิบายเสริม


ส่วนที่ 4 — การเข้ารหัสยุคคลาสสิก และจุดที่มันแตก

Scytale — สลับตำแหน่ง ไม่เปลี่ยนตัวอักษร

การเข้ารหัสยุคคลาสสิกเริ่มที่ กรีก ราว 500 ปีก่อนคริสตกาล ด้วย Scytale ซึ่งเป็นการเข้ารหัสของกองทัพสปาร์ตา

Scytale เป็น Transposition Cipher (รหัสสลับตำแหน่ง) ที่ใช้แท่งไม้กับแถบหนัง คือ ตัวอักษรไม่ถูกเปลี่ยน มีแต่ตำแหน่งที่ถูกสลับ ซึ่งต่างจากรหัสในหัวข้อถัดไป

Scytale ทำงานยังไงเสริม — ไม่ได้อยู่ในสไลด์

พันแถบหนังรอบแท่งไม้ที่มีเส้นผ่านศูนย์กลางเฉพาะ แล้วเขียนข้อความตามยาวของแท่ง พอคลายแถบหนังออก ตัวอักษรจะกระจายไม่เรียงกัน อ่านไม่รู้เรื่อง

ผู้รับต้องมีแท่งไม้ ขนาดเดียวกัน จึงจะพันกลับแล้วอ่านได้ ขนาดของแท่งไม้จึงทำหน้าที่เป็นกุญแจ

รหัสแทนที่ตัวอักษร

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 ต้องทำให้ ตัวอักษรเดียวกันเข้ารหัสออกมาไม่เหมือนกัน

ROT13 — ลองแกะดู

โจทย์คือข้อความนี้

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 ตรงกันได้ไหม

เข้ายาวเท่าไหร่ก็ได้ ออกยาวคงที่เสมอhelloไฟล์ 4 GB ศูนย์ล้วนhellphashSHA-2562cf24dba5fb0a30e...ddd45e35df0b6767...fdd7585e08c4e2af...ยาวเท่ากันหมด 256 บิตไม่มีทางกลับไม่มีฟังก์ชันผกผัน จึงถอดกลับเป็นต้นฉบับไม่ได้ข้อความที่เข้าไปมีได้ไม่จำกัด แต่ค่าที่ออกมามีจำกัด จึงต้องมีข้อความคนละชิ้นที่ได้ค่าเดียวกัน นั่นคือ collision
รูปที่ 2: ยาวแค่ไหนเข้าไปก็ได้ ออกมายาวเท่ากันเสมอ และไม่มีทางย้อนกลับ
คำอธิบาย 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
Stream cipher ที่ใช้จริงในโลก

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 25

AES ที่ใช้จริงทำงานแบบเดียวกันแต่ก้อนใหญ่กว่ามาก อยู่ในหัวข้อ "ของจริง — AES ทำงานกับ byte ไม่ใช่ตัวอักษร"

ECB — ส่งแต่ละก้อนเข้า E แยกกัน

ก้อนเดิมกับกุญแจเดิม ออกมาเป็นค่าเดิมทุกครั้งต้นฉบับเข้ารหัสผลลัพธ์ก้อน 1hEYก้อน 2eERก้อน 3lEFก้อน 4lEFก้อน 5oEJก้อน 3 กับ 4 เข้า E ด้วยตัวอักษรเดียวกัน จึงออกมาเป็นตัวเดียวกันไม่มีอะไรเปลี่ยนระหว่างก้อน ลายของต้นฉบับจึงหลุดออกมาครบ
รูปที่ 3: Electronic codebook (ECB) ส่งแต่ละก้อนเข้า E แยกกัน ต้นฉบับที่ซ้ำจึงได้ผลลัพธ์ที่ซ้ำ
  • ECB ก้อนละตัวอักษรคือรหัสแทนที่ของส่วนที่ 4 ลายของต้นฉบับหลุดออกมา นับความถี่แล้วแกะได้
  • คำถามที่ต้องถามกับทุกโหมดคือ Pattern is still there? เพราะ บางโหมดยังหาลายเจอได้อยู่ดี ลายยังอยู่ใน ECB และกลับมาได้ใน CBC ที่ใช้ IV เดิม หรือ CTR ที่ใช้ nonce ซ้ำ ซึ่งจะเจอข้างล่าง

CBC — บวกผลลัพธ์ของก้อนก่อนหน้าเข้าไปก่อน

ECB รั่วเพราะ l ตัวที่สองเข้า E ในสภาพเดียวกับตัวแรก

ผลลัพธ์ของก้อนก่อนหน้าถูกบวกเข้าไปก่อนเข้ารหัสต้นฉบับบวกเข้า Eเข้ารหัสผลลัพธ์IVsก้อน 1hzEZก้อน 2edEUก้อน 3lfEIก้อน 4ltEOก้อน 5ocECก้อน 3 กับ 4 ต้นฉบับเหมือนกัน แต่ผลบวกที่เข้า E ต่างกัน ผลลัพธ์จึงไม่ซ้ำก้อนแรกไม่มีก้อนก่อนหน้า จึงบวก IV แทน
รูปที่ 4: Cipher Block Chaining (CBC) ส่งผลลัพธ์ของแต่ละก้อนไปบวกกับต้นฉบับของก้อนถัดไป ก้อนแรกบวก IV แทน
  • เส้นจากผลลัพธ์ไปก้อนถัดไปคือ Chaining (การผูกเป็นลูกโซ่) ต้นฉบับซ้ำจึงไม่ได้ผลลัพธ์ซ้ำ
  • กล่อง s คือ Initial Vector (IV) (ค่าตั้งต้น) CBC กับรุ่นแปรของมันต้องมี IV เสมอ IV ต้องสุ่มใหม่ทุกครั้ง แต่ไม่ต้องเป็นความลับ ถ้าใช้ IV เดิม ข้อความเดิมจะได้ผลลัพธ์เดิม
  • เข้ารหัสทีละก้อนตามลำดับ ก้อนหลังต้องรอผลลัพธ์ของก้อนก่อน

PCBC — ส่งต้นฉบับตามไปด้วย

ใน CBC ถ้ามีคนแก้ผลลัพธ์ก้อนกลาง ผู้รับถอดแล้วเสียแค่ก้อนนั้นกับก้อนถัดไป ที่เหลือถอดได้ปกติ จึงอาจไม่ทันสังเกตว่าถูกแก้

ต้นฉบับกับผลลัพธ์ของก้อนก่อนหน้า ถูกบวกเข้าไปทั้งคู่ก่อนเข้ารหัสต้นฉบับบวกเข้า Eเข้ารหัสผลลัพธ์IVsก้อน 1hzEZก้อน 2ekEDก้อน 3lsENก้อน 4ljEBก้อน 5oaESเส้นจากต้นฉบับกับเส้นจากผลลัพธ์ มาบวกกันก่อน แล้วค่อยส่งไปก้อนถัดไปต่างจาก CBC แค่เส้นจากต้นฉบับเส้นเดียว ก้อนแรกยังบวก IV เหมือนเดิม
รูปที่ 5: Propagating CBC (PCBC) บวกทั้งต้นฉบับและผลลัพธ์ของก้อนก่อนหน้าเข้าไป
  • ต่างจาก CBC แค่เส้นจากต้นฉบับ
  • ข้อนี้เป็นคำอธิบายเสริม ผลลัพธ์เสียก้อนเดียว ทุกก้อนหลังจากนั้นถอดออกมาเสีย การแก้ไขจึงเห็นง่ายขึ้น แต่สลับผลลัพธ์สองก้อนที่ติดกันแล้วก้อนหลังจากนั้นกลับถอดได้ปกติ จึงยังไม่นับว่าตรวจ integrity ได้

CFB และ OFB — ให้ E ผลิตกุญแจที่ไม่วนซ้ำ

กุญแจ LUCKY ของ Vigenère วนซ้ำทุก 5 ตัว ตัวที่ 1, 6, 11 ใช้ L เดียวกันหมด จึงเป็นรหัสแทนที่แบบตายตัวอีกชุด ข้อความยาวพอก็นับความถี่แยกทีละชุดแล้วแกะได้อีก

ต้นฉบับไม่เข้า E เลย E แค่ผลิต keystream มาบวกก้อน 1ก้อน 2ก้อน 3ก้อน 4ก้อน 5CFB — วนผลลัพธ์กลับไปเข้า Eเข้า Eเข้ารหัสkeystreamบวกผลลัพธ์IV sENhUUEPeTTEOlZZEZlKKEDoROFB — วน keystream กลับไปเข้า Eเข้า Eเข้ารหัสkeystreamบวกผลลัพธ์IV sENhUNEHeLHEYlJYEXlIXEWoKก้อนแรกเหมือนกันเพราะเริ่มจาก IV ตัวเดียวกัน หลังจากนั้นแยกทางกันผู้รับผลิต keystream ชุดเดิมด้วย E ตัวเดิม แล้วลบออกก็ได้ต้นฉบับคืน
รูปที่ 6: Cipher Feedback (CFB) กับ Output Feedback (OFB) ต่อสายเหมือนกันทุกเส้น ยกเว้นเส้นที่วนกลับไปเข้า E ของก้อนถัดไป
  • ต้นฉบับไม่เข้า E เลย E ผลิต Keystream (สายกุญแจ) ที่ไม่วนซ้ำ block cipher จึงถูกใช้ทำงานแบบ stream cipher
  • เส้นที่วนกลับเข้า E คือ Feedback (การป้อนกลับ) CFB มี IV และใช้ผลลัพธ์เป็นตัวป้อนของก้อนถัดไป ส่วน OFB วน keystream กลับ

CTR — ใช้ตัวนับแทนการรอก้อนก่อนหน้า

CBC, CFB และ OFB ต้องทำทีละก้อน ก้อนที่ 1,000 ต้องรอก้อนที่ 999 เครื่องหลาย core ก็ช่วยไม่ได้

เข้ารหัสเลขนับแทนต้นฉบับ แต่ละก้อนไม่ต้องรอก้อนไหนเลยnonce + ตัวนับเข้ารหัสkeystreamบวกผลลัพธ์ก้อน 1c+0=cEChJก้อน 2c+1=dEUeYก้อน 3c+2=eERlCก้อน 4c+3=fEIlTก้อน 5c+4=gEToHไม่มีเส้นข้ามก้อน จะคำนวณก้อน 5 ก่อนก้อน 1 ก็ได้ ทุกก้อนจึงทำพร้อมกันได้ก้อน 3 กับ 4 ต้นฉบับเหมือนกัน แต่ตัวนับต่างกัน keystream จึงต่างกัน
รูปที่ 7: Counter (CTR) สร้างตัวที่เข้า E ของแต่ละก้อนจาก nonce กับตัวนับ จึงไม่มีเส้นไหนข้ามก้อน
  • 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 — CTR ที่ตรวจ integrity ได้ในตัว

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 ตัวอักษรจึงเป็นหนึ่งก้อนพอดี

AES-128 หนึ่งก้อนหน้าตาเป็นยังไงเสริม — ไม่ได้อยู่ในสไลด์
ค่าขนาด
ต้นฉบับABCDEFGHIJKLMNOP16 byte
กุญแจ000102030405060708090a0b0c0d0e0f16 byte เขียนเป็นเลขฐานสิบหก สองหลักต่อหนึ่ง byte
ผลลัพธ์9cdd85de85b48bed892f02d8a5cbdacb16 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 0C

ECB กับ 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 -c16
9cdd85de85b48bed892f02d8a5cbdacb
9cdd85de85b48bed892f02d8a5cbdacb

สองก้อนออกมาเหมือนกันทุกตัว เปลี่ยน -aes-128-ecb เป็น -aes-128-cbc -iv 0f0e0d0c0b0a09080706050403020100 แล้วรันใหม่

e826d336a6931efe81530fad9bee86c6
c98437a8a92f2ef895faf7c5caa46ee7

เทียบทุกโหมด

โหมดทั้งหมดต่างกันที่สี่เรื่อง คือ Initial Vector, Padding, Chaining และ Feedback ECB คือ Block to Block without feedback or IV ส่งทีละก้อนโดยไม่มีทั้งสองอย่าง คุณสมบัติส่วนใหญ่ในตารางนี้ไม่ได้อยู่ในสไลด์ เรียบเรียงเพิ่มไว้สำหรับทวน

ต่อสายยังไง

โหมดIVPaddingส่งอะไรต่อไปก้อนถัดไป
ECBไม่มีต้องไม่มี
CBCมีต้องผลลัพธ์ (chaining)
PCBCมีต้องต้นฉบับกับผลลัพธ์ (chaining)
CFBมีไม่ต้องผลลัพธ์ (feedback)
OFBมีไม่ต้องkeystream (feedback)
CTRnonce กับตัวนับไม่ต้องไม่มี
GCMnonce กับตัวนับไม่ต้องไม่มี

แล้วได้อะไรตามมา

โหมดทำทุกก้อนพร้อมกันได้ผลลัพธ์เสีย 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 ของคู่นั้นเท่านั้น และในทางกลับกันก็เช่นกัน
ล็อกด้วยกุญแจดอกไหน ก็เปิดได้ด้วยอีกดอกของคู่นั้นเสมอทิศที่ 1 — ปิดความลับล็อกด้วย pub ของผู้รับเปิดด้วย priv ของผู้รับมีแต่ผู้รับที่มี privคนอื่นอ่านไม่ออกทิศที่ 2 — พิสูจน์ต้นทางล็อกด้วย priv ของผู้ส่งเปิดด้วย pub ของผู้ส่งใครก็เปิดได้ ไม่เป็นความลับแต่แปลว่าผู้ส่งเป็นคนล็อกต้องการทั้งสองอย่างพร้อมกัน ก็ล็อกซ้อนสองชั้น
รูปที่ 8: กุญแจคู่เดียวกัน ใช้คนละทิศได้ผลคนละอย่าง

ผลที่ได้คือ เราเก็บแค่ 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 ของอาจารย์

เซ็นแค่ค่าย่อยที่สั้น ไม่ได้เข้ารหัสทั้งข้อความฝั่งผู้ส่งข้อความhashค่าย่อยล็อกด้วย priv ผู้ส่งข้อความธรรมดาลายเซ็นฝั่งผู้รับข้อความที่ได้รับลายเซ็นที่ได้รับย่อยเองด้วย hashเปิดด้วย pub ผู้ส่งเทียบกันตรงกัน แปลว่าข้อความไม่ถูกแก้ และผู้ส่งเป็นคนเซ็นจริง
รูปที่ 9: ย่อด้วย hash เพราะเร็ว เซ็นด้วย 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 ประโยคนี้เป็นข้อมูลเสริม

กุญแจสาธารณะถูกใช้ครั้งเดียวตอนตกลงกุญแจ แล้วก็เลิกใช้ClientServer1. ขอหน้าเว็บ https://www.chula.ac.th/2. นี่กุญแจสาธารณะกับใบรับรองของผม3. ใช้ RC4 นะ นี่กุญแจ ล็อกด้วย pub ของเซิร์ฟเวอร์4. รับส่งข้อมูลจริง ล็อกด้วยกุญแจสมมาตรดอกนั้น
รูปที่ 10: ใช้กุญแจสาธารณะครั้งเดียวเพื่อตกลงกุญแจสมมาตร แล้วที่เหลือใช้กุญแจสมมาตรทั้งหมด

จุดสำคัญมีสามข้อ

  • ไคลเอนต์เป็นคนเลือกว่าจะใช้ 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 / DigestMD5, SHA-1, SHA-256, SHA-512ทางเดียว ความยาวคงที่ MD5 กับ SHA-1 หา collision ได้แล้ว
Tiger-Hashhash ที่ออกแบบมาให้เร็วบนเครื่อง 64 บิต
Stream CipherRC4, CHACHA, SEALทำทีละบิตหรือทีละตัวอักษร RC4 เคยอยู่ใน SSL, WEP, WPA
Block CipherBlowfish, DES, 3DES, AESทำทีละก้อน DES คือมาตรฐานเก่าที่กุญแจยาว 56 บิต สั้นจนลองหมดทุกค่าได้แล้ว 3DES คือการเอา DES มาทำซ้ำสามรอบเพื่อยืดอายุการใช้งาน Blowfish คือ block cipher ก้อนละ 64 บิตที่ออกแบบมาใช้แทน DES
Public KeyRSA, DSAสร้างจากจำนวนเฉพาะ ช้าที่สุดในสามกลุ่ม DSA ใช้เซ็นอย่างเดียว ไม่ใช้ปิดความลับ
รายชื่อในตารางบางตัวมีแต่ชื่อในบทนี้

Tiger-Hash, CHACHA, SEAL, Blowfish, DES, 3DES และ DSA ปรากฏเป็นชื่อในรายการโดยไม่มีคำอธิบายต่อ คอลัมน์หมายเหตุของเจ็ดตัวนี้ และเรื่องที่ MD5 กับ SHA-1 หา collision ได้แล้ว จึงเป็นข้อมูลเสริม เขียนไว้ให้พอแยกออกว่าแต่ละตัวอยู่กลุ่มไหนและต่างจากเพื่อนในกลุ่มยังไง

สรุปท้ายคาบ

Integrity

  • Integrity คือสภาพของการเป็น whole, complete, unbroken, undivided กับคน และ unified and unimpaired กับข้อมูล
  • บางครั้งเรียกว่า Authenticity จึงถูกนับเป็น A ตัวที่สี่ ต่อจาก Authentication, Authorization, Auditing
  • คำถามหลักของบท: How can we preserve the integrity of data? และคำตอบคือ integrity ต้องมีฮาร์ดแวร์หนุน

Trust

  • 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
  • จุดที่แตก: ถ้าข้อความยาวพอ นับความถี่ตัวอักษรแล้วแกะได้

Hash

  • one-way function ไม่มีฟังก์ชันผกผัน · เข้ายาวเท่าไหร่ก็ได้ ออก ยาวคงที่ · มี collision แน่นอนเพราะของไม่จำกัดลงช่องจำกัด
  • ใช้ตรวจ integrity เช่นยืนยันไฟล์จาก mirror site
  • ถอดกลับไม่ได้ จึงบางทีไม่ถูกนับเป็นการเข้ารหัส

Symmetric

  • 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

  • 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 ก้อนสุดท้าย

Public Key

  • ปัญหาเรื่องขนาด: อาจารย์กับนิสิต 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 ผสมคณิตศาสตร์ วิทยาการคอมพิวเตอร์ และความปลอดภัย จึง ต้องเรียนรู้ต่อเนื่อง

Security Protocol

  • คือ การรวมอัลกอริทึมหลายตัวเข้าด้วยกัน เพื่อรวมข้อดีและข้อเสีย
  • 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

เกริ่นนำ0%

ข้ามไปสรุป

On this page

คาบนี้จะพาไปไหนส่วนที่ 1 — Integrity คือ A ตัวที่สี่นิยามทำไมมันคือ A ตัวที่สี่ส่วนที่ 2 — Trust คือฐานของทุกอย่าง และเราต้องลดมันทุกโมเดลความปลอดภัยตั้งอยู่บน trustระบบที่ไว้ใจทุกอย่าง หน้าตาเป็นแบบไหนลดความไว้ใจด้วยการขีดขอบเขตSandboxส่วนที่ 3 — ฮาร์ดแวร์ที่ทำให้ขอบเขตเป็นจริงRingTagged Memoryแล้วถ้าไม่มีฮาร์ดแวร์ให้พึ่งล่ะส่วนที่ 4 — การเข้ารหัสยุคคลาสสิก และจุดที่มันแตกScytale — สลับตำแหน่ง ไม่เปลี่ยนตัวอักษรรหัสแทนที่ตัวอักษรจุดที่รหัสแบบนี้แตกส่วนที่ 5 — Hash: ทางเดียว ความยาวคงที่Collision คืออะไร และทำไมมันต้องมีเอา hash ไปใช้ตรวจ integrityส่วนที่ 6 — Symmetric: กุญแจดอกเดียวสองฝั่งStream CipherBlock Cipherส่วนที่ 7 — Mode of Operation: ส่งแต่ละก้อนเข้า cipher ยังไงECB — ส่งแต่ละก้อนเข้า E แยกกันCBC — บวกผลลัพธ์ของก้อนก่อนหน้าเข้าไปก่อนPCBC — ส่งต้นฉบับตามไปด้วยCFB และ OFB — ให้ E ผลิตกุญแจที่ไม่วนซ้ำCTR — ใช้ตัวนับแทนการรอก้อนก่อนหน้าของจริง — AES ทำงานกับ byte ไม่ใช่ตัวอักษรเทียบทุกโหมดส่วนที่ 8 — Public Key: กุญแจคนละดอกปัญหาที่กุญแจเดียวแก้ไม่ได้ล็อกสองชั้นให้ได้ทั้งความลับและการพิสูจน์ตัวตนราคาที่ต้องจ่ายส่วนที่ 9 — การเข้ารหัสให้อะไร และไม่ให้อะไรสรุปว่าการเข้ารหัสให้อะไรกับเราบ้างความท้าทายของยุคนี้ส่วนที่ 10 — Security Protocol: เอาหลายอย่างมาต่อกันDigital SignatureHTTPS, SSL และ TLSข้อสรุปเรื่อง integrityสิ่งที่บทนี้ยังไม่ได้พูดรายชื่ออัลกอริทึมที่ต้องแยกให้ออกสรุปท้ายคาบ