การเข้ารหัสฉบับ ก. ไก่

    ตอนแรกผมกำลังเขียนเรื่อง Assembly ภาค 3 อยู่ เพราะจะได้เป็นพื้นไปเรื่องของ COM+ แต่การที่จะเข้าใจ Assembly ภาค 3 นั้น เราต้องเข้าใจการเข้ารหัสพื้นฐานให้ดีเสียก่อน ดังนั้น ผมเลยเขียนเป็นบทความแยกต่างหากก็แล้วกัน

ความจำเป็นของการเข้ารหัส

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

    แต่วิธีต่างๆ ก็ยังไม่ปลอดภัยอยู่ดี ซ่อนอย่างไรก็ไม่เป็นผล จนมาถึงยุคสมัยกรีก มีการคิดค้นวิธีการที่ไม่ต้องซ่อน ศัตรูสามารถเห็นได้ แต่อ่านไม่รู้เรื่อง นั่นก็คือวิธีการเข้ารหัสนั่นเอง

    เมื่อมีการเข้ารหัส ก็มีความพยายามในการถอดรหัสโดยฝ่ายตรงกันข้ามควบคู่ไป อย่าดูถูกนะครับ นึกว่าเราออกแบบวิธีการเข้ารหัสที่ไม่มีใครรู้ ออกมาเป็นตัวมั่วๆ เขาจะแกะไม่ได้นะครับ พวกนักถอดรหัสเขาใช้หลักสถิติ และอื่นๆ จนแกะออกมาในที่สุด ในอดีตก็มีตัวอย่างให้เห็นในสงครามโลก เขาเชื่อกันว่าที่ญี่ปุ่นและเยอรมันรบแพ้นั้น ส่วนหนึ่งมาจากการเข้ารหัส Purple ของญี่ปุ่น และ Enigma ของเยอรมัน ถูกอีกฝ่ายหนึ่งแกะได้ ทำให้สามารถแอบฟังการส่งวิทยุได้

    ในยุคสมัยนี้สงครามแบบเอาอาวุธมาประเคนใส่กัน มีแต่ส่วนเล็กๆ เมื่อเทียบกับขนาดของโลก ทุกวันนี้สงครามทางการค้าเป็นสิ่งที่กำลังร้อนแรง การเข้ารหัสต่างจึงถูกนำออกมาจากวงการทหารสู่พลเรือน ทุกวันนี้ชีวิตของเราก็อยู่กับการเข้ารหัสครับ ตั้งแต่การใช้มือถือ ดู UBC email account บัตร ATM อื่นๆ อีกมากมายล้วนแล้วแต่มีเรื่องการเข้ารหัสผสมอยู่ด้วยทั้งสิ้น

การเข้ารหัสแบบ Classic

    การเข้ารหัสแบบนี้เป็นแบบแรกๆ ครับ อาจจะใช้วิธีเลื่อนตัวอักษร หรือ สลับที่ หรือ ย้ายไปอยู่ที่อื่น อื่นๆ อีกมาก แต่วิธีเหล่านี้สามารถถูกถอดโดยผู้เชี่ยวชาญได้โดยง่ายครับ

การเข้ารหัสแบบ Single key

    การเข้ารหัสยุคใหม่นั้น ใช้หลักการคณิตศาสตร์มาผสม รวมทั้งการเข้าถึงข้อมูลในระดับ bit บวกเข้ากับแนวคิดของการเข้ารหัสแบบ Classic ทำให้เกิดเป็นหลักการนี้ขึ้นมาครับ วิธีการก็คือเอาข้อมูลที่เราต้องการเข้ารหัสเป็นตัวตั้ง จากนั้นก็ให้เรานิยามกุญแจ ซึ่งเป็นตัวเลขหรือตัวอักษร (ASCII code 0 - 255) หลายตัวรวมกันเป็นกุญแจ (key) จากนั้นก็เอาไปเข้าสูตรผสม ผลลัพธ์ออกมาเป็นก้อนข้อมูลรหัสที่ไม่มีใครอ่านเข้าใจ เมื่อถึงปลายทาง เราก็เอากุญแจตัวเดิม นั้นแหละเข้าเข้าผสมกับก้อนข้อมูลรหัส เมื่อเข้าสูตรอีกที ผลลัพธ์ที่ได้ก็จะออกมาเป็นข้อมูลต้นฉบับ

    สูตรที่ดังๆ ที่นิยมใช้ก็มี DES, IDEA, Blowfish, GOST เป็นต้น ตัวที่เป็นมาตรฐานอุตสาหกรรม ก็คือ DES ซึ่งใช้กับพวกมือถือและ Cable TV ตาวเทียม ซึ่งคิดค้นกันมานานมากแล้ว ปัจจุบันมันอ่อนเกินไปแล้ว (อ่อนอย่างไรดูในส่วนต่อๆ ไปครับ) จนกระทั่งเมื่อ 2 ปีที่ผ่านมา ทางรัฐบาลสหรัฐประกาศแข่งขันหาสูตรใหม่เพื่อทดแทน DES ซึ่งใช้เวลา 2 ปีในการแข่งขัน จนกระทั่งได้ผู้ชนะครับ กับสูตรที่ชื่อว่า Rijindael ซึ่งปัจจุบันรู้จักกันในชื่อ AES ครับ

การเข้ารหัสแบบ 2 keys

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

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

    แนวคิดของ 2 keys จึงเกิดขึ้นครับ หลักการก็เข้าใจไม่ยากครับ คือถ้าคุณเอาข้อมูล ไปผสมกับกุญแจตัวใดตัวหนึ่ง เมื่อได้ออกมาเป็นข้อมูลรหัสที่อ่านไม่รู้เรื่องแล้ว เมื่อเวลาถอดคุณไม่สามารถใช้กุญแจตัวเดิมได้ คุณต้องใช้กุญแจอีกตัวหนึ่งที่เป็นแฝดคนละฝามาถอด เข้าด้วย 1 ต้องถอดด้วย 2 หรือ เข้าด้วย 2 จะต้องถอดด้วย 1 เท่านั้นครับ

    กุญแจ 2 ตัวนี้ ไม่ใช่เราคิดเองนะครับ มันต้องมีคุณสมบัติแบบแฝดคนละฝาด้วย คือเข้าด้วยตัวหนึ่งต้องถอดด้วยตัวที่เหลือ ดังนั้นต้องใช้เครื่องคอมพิวเตอร์คำนวณขึ้นมาครับ หลักการที่ใช้คือเรื่อง Number Theory ซึ่งเป็นวิชาบังคับของนักศึกษาเอกคณิตศาสตร์ (ถ้าผมจำไม่ผิด)

    กุญแจตัวแรก เราเรียกว่า Private key เราจะเก็บไว้กับตัวเองครับ จำเอาเป็นหลักการนะครับ ว่า Private key นี้ไม่มีวันที่จะให้คนอื่นเห็น ส่วนกุญแจอีกตัวหนึ่งเราตั้งชื่อว่า Public key ซึ่งเราจะแจกจ่ายให้กับทุกคนในโลก ใครก็ได้ไม่เลือกที่รักมักที่ชังครับ

    เมื่อเราผู้ที่อยากเป็นนักเขียนนวนิยาย อยากจะส่งตัวอย่างไปให้กองบรรณาธิการ อันดับแรกเราต้องขอ กุญแจ Public key ของกองบรรณาธิการมาก่อน ซึ่งเขาอาจจะส่งให้เราโดยตรง หรือเอาอาจจะหยิบเอาเองจาก Server ที่เก็บ Public key โดยเฉพาะก็ได้ จากนั้น เราก็เอากุญแจดังกล่าวไปเข้ารหัสกับนวนิยายของเรา ผลลัพธ์ออกมาเป็นก้อนรหัส ซึ่งเราส่ง email ไปสำนักพิมพ์ได้เลย ระหว่างทางจะไม่มีใครแกะได้ เราเองก็แกะไม่ได้ ผู้ที่แกะได้มีคนเดียวคือกองบรรณาธิการ ผู้ซึ่งมีกุญแจแฝดคนละฝา หรือ Private key เท่านั้น  แบบนี้ปลอดภัยกว่ามากครับ

    วิธีการดังกล่าว มีสูตรอยู่หลายสูตรครับ เช่น RSA, Lucus เป็นต้น แต่ทุกวันนี้ RSA ดูเหมือนว่าครองตลาดได้มากกว่า 99%

ที่ว่าปลอดภัยมั่นใจได้แค่ไหน

    หลายคนอาจจะพูดว่า Security เป็นสิ่งไม่น่าเชื่อถือ เห็นคุยว่าดีทีไร สุดท้ายก็มีพวก Hacker แกะออกจนได้ แต่เรื่องนี้มันคนละเรื่องกันครับ ถ้า Hacker พวกนั้นเก่งจริงก็สมควรได้รางวัล Nobel ครับ (ขออภัยครับ รางวัล Nobel สาขาคณิตศาสตร์ไม่มีครับ เพราะนาย Nobel ไม่ชอบคณิตศาสตร์ ถ้ารางวัลสำหรับนักคณิตศาสตร์ คือ Fields Medal ครับ เทียบเท่ากับ Nobel จัดทุก 4 ปี มันต้องใช้คณิตศาสตร์ล้วนในการถอดรหัสครับ ส่วนมากแล้วสิ่งที่ Hacker ทำนั้นจะไม่ได้ทำอะไรตรงๆ ครับ เช่นเราบอกว่าประตูของเรามีระบบกลอนแน่นหนาดีที่สุดในโลก เขาไม่สนใจประตูหรอกครับ โน่นเลย ไปทุบหน้าต่างที่เป็นกระจกดีกว่า ผลลัพธ์ได้เท่ากัน คือเข้าบ้านได้ คนส่วนมากก็เข้าใจผิดคิดว่าระบบกลอนนั้นไม่ work จริงๆ แล้วไม่ใช่ครับ

    หลักการที่นิยมใช้กันอยู่ก็คือ เมื่อใครคิดค้นสูตรในการเข้ารหัสได้ ก็จะเอาไปประกาศไว้ รอคนพยายามมาแกะ ถ้าใครแกะผ่านก็ดังไปครับ ถ้าตราบใดยังไม่มีใครแกะได้ก็ถือว่าปลอดภัย วิธีการนี้ดีกว่าคิดสูตรเอาไว้ แล้วปิดสูตรเป็นความลับครับ เพราะนักแกะเขาเก่งมาก สู้ประกาศเอาไว้ดีกว่า

    แต่ถึงแม้ว่าสูตรการเข้ารหัสจะดีแค่ไหนก็ตาม อย่างไรเสียก็จะมีวิธีหนึ่งครับ ที่รับประกันได้เลยว่าแกะได้ทุกสูตร นั่นก็คือ Brute force หลักการก็ตรงไปตรงมาครับ คือลองเอากุญแจทุกตัวมาไขดู ยังไงมันก็มีตัวหนึ่งนั่นแหละที่ใช่ แต่วิธีนี้ใช้เวลามากครับ ในอดีตที่คิดสูตร DES ขึ้นมา ก็ใช้พื้นฐานของความเร็วเครื่องคอมพิวเตอร์ในยุคนั้น บวกเข้ากับอัตราการเพิ่มความเร็วตามกฎของมัวร์ เลยประเมินได้ว่า ต้องใช้เวลามหาศาลในการไล่เอากุญแจทุกค่าไปลอง ผมไม่แน่ใจว่าตัวเลขจำนวนปีเป็นเท่าไหร่ แต่มากกว่า 10,000 ปีแน่นอน

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

Message Digest

    ในอดีตเมื่อเราต้องการส่งข้อมูลผ่าน Modem คงไม่มีใครจะส่งแฟ้มข้อมูลใหญ่ๆ รวดในทีเดียว เพราะการสื่อสารผ่านโทรศัพท์นั้น มีสัญญาณรบกวนค่อนข้างมาก ดังนั้นจึงตัดแฟ้มข้อมูลออกเป็นส่วนๆ ที่นิยมกันในอดีต ก็จะส่วนละ 1kb ค่อยๆ ทยอยส่ง แต่ก็นั่นแหละครับ ถ้ามีสัญญาณรบกวนเกิดขึ้น เปลี่ยน bit ใด bit หนึ่ง ผิดพลาดไป แฟ้มข้อมูลจะเสียหายไปเลย ดังนั้น เขาจึงเอาข้อมูล 1kb นั้นมาเข้าสูตรคณิตศาสตร์ เพื่อสร้างออกมาเป็นเลขเฉพาะเลขหนึ่ง ซึ่งเราเรียกว่า CRC นั่นเอง ซึ่งปกติแล้วจะมีขนาด 2 bytes หรือ 4 bytes และส่งไปด้วยกับข้อมูล 1 kb นั้น เมื่อฝ่ายรับ รับ 1 kb นั้นไป ก็ต้องเอาเข้าสูตร CRC เพื่อตรวจสอบดูว่าได้ค่า CRC ตรงกับที่ส่งมาหรือไม่ ถ้าตรงกันก็แสดงว่าถูกต้อง แต่ถ้าไม่ตรง ก็ต้องขอให้ฝ่ายส่ง ส่งมาใหม่

    หลักการของ CRC ก็ได้นำมาประยุกต์เข้ากับเอกสารธรรมดา เราสามารถสร้าง สร้างสิ่งที่คล้ายๆ กับ CRC ได้ โดยที่เราเอาเอกสารเข้าสูตรที่เรียกว่า One-way Hashing ผลลัพธ์เราจะได้เลขออกมาตัวหนึ่ง นั่นก็คือสิ่งที่เรียกว่า Message Digest นั่นเอง โดยปกติแล้ว Message Digest ที่สร้างขึ้นมานั้น โอกาสซ้ำมีน้อยมาก ไม่รู้ หนึ่งใน กี่ล้านล้าน

 

Electronic Signature

    คุณเคยอ่านพวก Usenet หรือ Web Board ต่างๆ ไหมครับ สมมุติว่า ซักวันหนึ่งมี message ฉบับหนึ่ง โผล่ออกมาใน Web Board อ้างว่ามาจาก Bill Gate บอกว่า เขาจะ Retire แล้ว จะปิดบริษัท Microsoft เป็นการถาวรใน 3 เดือน คุณคงคุ้นเคยกับ message แบบนี้นะครับ ในสังคมที่เราอาศัยอยู่นี้ มันมีพวกชอบสนุก หรือหวังผลไม่ดีอยู่มาก ถ้าคุณเห็น Message ฉบับดังกล่าว คุณจะเชื่อหรือไม่ ว่าเป็นของจริง ผมว่าคุณก็คงไม่เชื่อ ดังนั้นจึงมีนักวิทยาศาสตร์คอมพิวเตอร์พยายามหาวิธีที่จะระบุชี้ชัดไปเลยว่า Message ต่างๆ ที่เขียนอยู่ทุกวันนี้ ยืนยันผู้เขียนจริงๆ ได้หรือไม่

    เขาใช้ Message Digest ผสมกับ กับการเข้ารหัสครับ ถ้าคุณเป็น Bill Gate ตัวจริง และต้องการให้ผู้อื่นเชื่อถือว่าเรื่องที่เขียนนั้นจริงๆ เริ่มต้น คุณก็เขียนเอกสารนั้นให้เสร็จก่อน จากนั้นก็เอาเอกสารเข้า Message Digest จนได้ออกมาเป็นเลขตัวหนึ่ง จากนั้นคุณก็เอา Private Key ของคุณเพื่อเข้ารหัส ตัว Message Digest นั้น ได้มาเป็นก้อนรหัส จากนั้นก็ส่ง Message ตัวต้นฉบับ ไปพร้อมกับ ก้อนรหัสบน Web Board ครับ

    ที่นี้ใครอยากอ่านก็อ่านได้ครับ ตัวเอกสารไม่ได้ถูกเข้ารหัส แต่เชื่อหรือไม่ก็สุดแล้วแต่ แต่ถ้าเขาต้องการพิสูจน์ว่าเอกสารดังกล่าวมาจาก Bill Gate จริงหรือไม่ เขาต้องไปขอ Public Key ของ Bill Gate อาจจะมาจาก Site ที่เก็บ Public key โดยเฉพาะก็ได้ จากนั้นก็เอามาแกะ Message Digest ที่กระทำการเข้ารหัสกับกับ Private Key ของ Bill gate ถ้าแกะไม่ได้ แสดงว่ามีปัญหา แต่ถ้าแกะได้ ก็ต้องเอาเอกสาร ไปเข้า Message Digest เพื่อมาเปรียบเทียบกับ Message Digest ที่แกะได้ ถ้าได้ค่าตรงกัน ก็ยืนยันได้ว่า มาจาก Bill Gate จริงๆ และไม่ได้มีการแก้ไขตัวอักษรหรือตัวเลขใดๆ ก่อนถึงมือเรา

    วิธีนี้กำลังเป็นที่นิยมครับ

ทิ้งท้าย

    เรื่องของการเข้ารหัสยังมีอีกมากครับ ถ้าใครสนใจ ยังมีการประยุกต์ และอะไรให้ศึกษากันอีกมาก เรียนกันไม่จบครับ แต่เท่านี้ก็พอเพียงที่จะทำให้เราเข้าใจการทำงานของ Shared Assembly แล้วครับ เอาไว้คราวหน้าผมจะมีเรื่องสำหรับ Shared Assembly ให้อ่านกัน