ถ้าอินเทอร์เน็ตเป็นทางหลวงข้อมูลแล้วเส้นทางอีเมลก็คือหุบเหวแคบ เฉพาะรถลากขนาดเล็กสามารถผ่านได้
ระบบการขนส่งอีเมลถูกออกแบบมาสำหรับข้อความ ASCII ธรรมดาเท่านั้น การพยายามส่งข้อความในภาษาอื่นหรือไฟล์โดยพลการก็เหมือนกับการได้รับรถบรรทุกผ่านหุบเหว
รถบรรทุกขนาดใหญ่จะผ่านช่องแคบอย่างไร?
แล้วคุณจะส่งรถบรรทุกขนาดใหญ่ผ่านลำธารขนาดเล็กได้อย่างไร? คุณต้องเอามันไปหาชิ้นที่ปลายด้านหนึ่งขนส่งชิ้นส่วนผ่านหุบเหวและสร้างรถบรรทุกจากชิ้นที่ปลายอีกด้านหนึ่ง
เช่นเดียวกันจะเกิดขึ้นเมื่อคุณส่งไฟล์แนบผ่านทางอีเมล ในกระบวนการที่เรียกว่าการเข้ารหัสข้อมูลไบนารีจะเปลี่ยนเป็นข้อความ ASCII ซึ่งสามารถส่งผ่านอีเมลได้โดยไม่มีปัญหา ในตอนท้ายของผู้รับข้อมูลจะถูกถอดรหัสและไฟล์ต้นฉบับจะถูกสร้างใหม่
วิธีหนึ่งในการเข้ารหัสข้อมูลโดยพลการเป็นข้อความ ASCII ธรรมดาคือ Base64 เป็นหนึ่งในเทคนิคที่ใช้โดยมาตรฐาน MIME ในการส่งข้อมูลอื่น ๆ นอกเหนือจากข้อความล้วน
Base64 เพื่อช่วยเหลือ
การเข้ารหัส Base64 ใช้เวลา 3 ไบต์ซึ่งประกอบด้วย 8 บิตและแสดงเป็นอักขระที่พิมพ์ได้ 4 ตัวในมาตรฐาน ASCII มันไม่ว่าในหลักสองขั้นตอน
ขั้นตอนแรกคือการแปลงสามไบต์เป็นสี่จำนวนหกบิต อักขระแต่ละตัวในมาตรฐาน ASCII ประกอบด้วยเจ็ดบิต Base64 ใช้เฉพาะ 6 บิต (สอดคล้องกับ 2 ^ 6 = 64 อักขระ) เพื่อให้แน่ใจว่าข้อมูลที่เข้ารหัสสามารถพิมพ์ได้และสามารถอ่านได้แบบมนุษย์ ไม่มีอักขระพิเศษใดที่มีอยู่ใน ASCII
อักขระ 64 ตัว (ด้วยเหตุนี้ Base64 ชื่อ) มี 10 หลัก, 26 ตัวพิมพ์เล็ก, 26 ตัวพิมพ์ใหญ่เช่นเดียวกับ '+' และ '/'
ถ้าตัวอย่างเช่นไบต์ที่สามคือ 155, 162 และ 233 กระแสบิตที่สอดคล้องกัน (และน่ากลัว) คือ 100110111010001011101001 ซึ่งจะตรงกับค่า 6 บิต 38, 58, 11 และ 41
ตัวเลขเหล่านี้จะถูกแปลงเป็นอักขระ ASCII ในขั้นตอนที่สองโดยใช้ตารางการเข้ารหัส Base64 ค่า 6 บิตของตัวอย่างของเราแปลเป็นลำดับ ASCII "m6Lp"
- 155 -> 10011011
- 162 -> 10100010
- 233 -> 11101001
- 100110 -> 38
- 111010 -> 58
- 001011 -> 11
- 101001 -> 41
- 38 -> เมตร
- 58 -> 6
- 11 -> L
- 41 -> p
กระบวนการสองขั้นตอนนี้ใช้กับลำดับไบต์ทั้งหมดที่เข้ารหัส เพื่อให้แน่ใจว่าข้อมูลที่เข้ารหัสสามารถพิมพ์ได้อย่างถูกต้องและไม่เกินความยาวบรรทัดของเซิร์ฟเวอร์จดหมายจะมีการแทรกอักขระบรรทัดใหม่เพื่อให้บรรทัดยาวต่ำกว่า 76 อักขระ ตัวอักษรใหม่จะถูกเข้ารหัสเช่นเดียวกับข้อมูลอื่น ๆ ทั้งหมด
การแก้ปัญหา Endgame
ในตอนท้ายของขั้นตอนการเข้ารหัสเราอาจประสบปัญหา ถ้าขนาดของข้อมูลต้นฉบับเป็นไบต์เป็นจำนวนหลายสามข้อทุกอย่างทำงานได้ดี ถ้าไม่ใช่เราอาจจะจบลงด้วยไบต์ 8 บิตหนึ่งหรือสองอัน สำหรับการเข้ารหัสที่ถูกต้องเราจำเป็นต้องมี 3 ไบต์อย่างแน่นอน
การแก้ปัญหาคือการผนวกพอไบต์ที่มีค่าเป็น "0" เพื่อสร้างกลุ่ม 3 ไบต์ ค่าสองค่าดังกล่าวจะถูกผนวกเข้าถ้าเรามีไบต์ข้อมูลเสริมหนึ่งไบข้อมูลหนึ่งชุดจะถูกเพิ่มเป็นสองไบต์พิเศษ
แน่นอนว่าการลากเส้นเทียมเหล่านี้ '0' ไม่สามารถเข้ารหัสได้โดยใช้ตารางการเข้ารหัสด้านล่าง ต้องเป็นอักขระ 65 ตัว
อักขระ padding Base64 คือ '=' โดยธรรมชาติแล้วจะสามารถปรากฏได้เฉพาะเมื่อสิ้นสุดการเข้ารหัสเท่านั้น
ตารางการเข้ารหัส Base64
ราคา | ถ่าน | ราคา | ถ่าน | ราคา | ถ่าน | ราคา | ถ่าน | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | 16 | Q | 32 | ก. | 48 | W | ||||
1 | B | 17 | R | 33 | ชั่วโมง | 49 | x | |||
2 | C | 18 | S | 34 | ผม | 50 | Y | |||
3 | D | 19 | T | 35 | J | 51 | Z | |||
4 | E | 20 | ยู | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | ล. | 53 | 1 | |||
6 | G | 22 | W | 38 | ม. | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | ผม | 24 | Y | 40 | โอ | 56 | 4 | |||
9 | J | 25 | Z | 41 | พี | 57 | 5 | |||
10 | K | 26 | 42 | Q | 58 | 6 | ||||
11 | L | 27 | ข | 43 | R | 59 | 7 | |||
12 | M | 28 | ค | 44 | s | 60 | 8 | |||
13 | ยังไม่มีข้อความ | 29 | d | 45 | เสื้อ | 61 | 9 | |||
14 | O | 30 | อี | 46 | ยู | 62 | + | |||
15 | P | 31 | ฉ | 47 | โวลต์ | 63 | / |