How does Base64 work

English 简体中文 繁体中文 ภาษาไทย Tiếng Việt
Summary

Base64 is an encoding scheme primarily used for safely transferring arbitrary binary data, such as within HTTP headers, by converting it into a sequence of readable ASCII characters. The process involves breaking 8-bit input into 6-bit chunks, each mapped to one of 64 specific characters from a defined set. This conversion inherently increases the data size by approximately 33%. To handle incomplete blocks, Base64 utilizes padding with the '=' character, specifically ensuring 24-bit (3-byte) alignment, which is critical for maintaining data integrity during decoding, especially when concatenating encoded strings.

Base64 คือรูปแบบการเข้ารหัสข้อมูลที่ใช้ในการถ่ายโอนข้อมูลที่ปลอดภัย เช่น HTTP และส่วนขยายต่างๆ การเข้ารหัส Base64 สามารถแปลงกลุ่มไบต์ใดๆ ให้เป็นลำดับของอักขระ ASCII ที่อ่านได้ อักขระที่แปลงเหล่านี้สามารถใส่ในส่วนหัว HTTP ได้อย่างปลอดภัยโดยไม่ก่อให้เกิดปัญหาใดๆ ในขณะที่เพียร์ประมวลผลส่วนหัว HTTP

การเข้ารหัส Base64 ถูกคิดค้นขึ้นเป็นส่วนหนึ่งของการเข้ารหัสการถ่ายโอนเนื้อหา MIME ซึ่งคล้ายกับรูปแบบการเข้ารหัสอื่นๆ เช่น Uuencode และ BinHex แต่มีประสิทธิภาพสูงกว่า

8 บิต เป็น 6 บิต

Base64 จะแบ่งไบต์ออกเป็นกลุ่มละ 6 บิต ทุกๆ 6 บิตจะแมปกับอักขระหนึ่งตัว อักขระนี้จะเป็นหนึ่งใน 64 อักขระในตารางอักขระ Base64 อักขระ 64 ตัวนี้เป็นอักขระทั่วไปและสามารถใส่ในส่วนหัว HTTP ได้อย่างปลอดภัย อักขระเหล่านี้รวมถึง a-z, A-Z, 0-9, +, / และอักขระพิเศษ =(อักขระตัวที่ 65)

เนื่องจาก Base64 จะใช้อักขระหนึ่งตัวแทนข้อมูล 6 บิต ดังนั้นขนาดของข้อมูลที่เข้ารหัส Base64 จะใหญ่กว่าข้อมูลเดิม 33% 

ด้านล่างนี้เป็นตัวอย่างง่ายๆ ของวิธีการทำงานของ Base64 สมมติว่ามีอักขระสามตัวคือ "Ow!" ซึ่งจะถูกเข้ารหัส Base64

  1. อักขระ "Ow!" จะถูกแปลงเป็นไบต์ 8 บิตสามตัว (0x4F, 0x77, 0x21)
  2. ไบต์ 3 ตัวนี้จะถูกแปลงเป็น 24 บิต (01001111 01110111 00100001)
  3. 24 บิตนี้จะถูกแบ่งออกเป็นกลุ่มละ 6 บิต (010011、110111、011100、1000001) 
  4. แต่ละ 6 บิตจะเป็นค่าระหว่าง 0 ถึง 63 ซึ่งจะแมปกับหนึ่งใน 64 อักขระด้านบน ผลลัพธ์สุดท้ายหลังจากการเข้ารหัสคือ "T3ch"

การเติม Base64

Base64 จะใช้ลำดับไบต์และแบ่งออกเป็นกลุ่มละ 6 บิต บางครั้งเป็นไปไม่ได้ที่จะแบ่งลำดับออกเป็นจำนวนกลุ่ม 6 บิตที่แน่นอน ในกรณีนี้ 0 จะถูกเติมลงในลำดับเพื่อให้เป็นจำนวนกลุ่ม 24 บิตที่แน่นอน (ตัวคูณร่วมน้อยของ 6 และ 8) กระบวนการนี้เรียกว่าการเติม

เมื่อเข้ารหัสข้อมูลที่เติม หากมีกลุ่ม 6 บิตที่เติมเต็ม (แต่ละบิตในกลุ่มถูกเติมโดยไม่มีบิตใดๆ จากข้อมูลเดิม) จะถูกแมปเป็น "=" 

ด้านล่างนี้เป็นตัวอย่างบางส่วนของวิธีการทำงานของการเติม :

  • a:a -- 011000 010011 101001 100001 -- YTph

  • a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==

  • a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=

  • a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh

เหตุผลที่ต้องเติมเป็น 24 บิต แต่ไม่ใช่ 6 บิต ก็เพราะว่ามันทำให้มั่นใจได้ว่าข้อมูลที่ถอดรหัสจะเหมือนกับข้อมูลเดิม หากลำดับที่เข้ารหัส Based64 สองลำดับถูกต่อกันแล้วถอดรหัส

ตัวอย่างเช่น หากเราเข้ารหัสสตริงสองสตริง "a.aa" และ "a.aa" หากเราเติมเพียง 6 บิต สตริงที่เข้ารหัสสำหรับ "a.aa" จะเป็น 011000 010011 101001 100001 011000 010000 ตอนนี้หากสตริงที่เข้ารหัสสองสตริงนี้ถูกต่อกัน มันจะกลายเป็น 010011 101001 100001 011000 010000 010011 101001 100001 011000 010000 หากสตริงนี้ถูกถอดรหัส ผลลัพธ์จะเป็น "01001110 10011000 01011000 01000001 00111010 01100001 01100001 0000 และไม่สามารถถอดรหัสได้อย่างถูกต้อง

อ้างอิง : https://segmentfault.com/a/1190000004533485?_ea=647157

ALGORITHM BASE64

  RELATED

  COMMENTS

2
Jo
Nov 2, 2017 at 4:32 pm

Simple and neat! thanks

Anonymous
Jan 11, 2018 at 6:37 pm
901234-123457