Hoang Kien
January 21, 2023

Base 64

Posted on January 21, 2023  •  7 minutes  • 1399 words

Mở đầu:

Lời đầu : Hôm nay mình sẽ giới thiệu đến anh em về base64 cũng như cách thức hoạt động của base64

Hoặc cũng chỉ đơn giản bài này trả lời thắc mắc của anh em tại sao chỉ với một chuỗi các ký tự nhưng base64 lại có thể hiện thị các hình ảnh.

Mục tiêu bài này:

Câu chuyện và khái niệm về base64:

Mình có tìm được đoạn trích nhỏ khá hay nói về câu chuyện ra đời của base64 trích dẫn :

" The history of the Base64 started long ago, in those times when engineers argued how many bits should be in a byte. Now we use eight-bit bytes, but before that were used seven-bit, six-bit, and even three-bit bytes. By the time the eight-bit encoding was approved as a standard, many systems used old encodings and did not support the “new standard”. This led to the fact that some data was simply lost during the transfer between the new and the old systems. For example, a mail server may discard the eighth bit when sending emails. Moreover, there was another problem with mail servers — they could only send text, but not binary data (such as images, video, archives). And so, in a magical way, clever minds develop an algorithm to solve these problems. Of course, over time, other binary-to-text encodings were developed, but thanks to the simplicity, efficiency and portability, Base64 became the most popular and was used almost everywhere. “

Đoạn văn này tạm dịch như sau : “Câu chuyện lịch sử của base64 bắt đầu từ rất lâu về trước . Từ cái thời khi các ông kỹ sư còn đang tranh luận về việc thiết kế trong một byte thì nên chứa bao nhiêu bit. Hiện tại chúng ta đã sử dụng 8 bit trong 1 byte nhưng trước đó chúng ta đã từng dùng 7 bit , 6 bit và thậm chí là 3 bit trong một byte . Theo dòng thời gian khi mà 8 bit đã được công nhận làm chuẩn . Thì rất nhiều hệ thống cũ vẫn sử dụng những chuẩn mã hóa cũ và chưa hỗ trợ “tiêu chuẩn 8 bit mới”. Nó dẫn tới dữ liệu trong quá trình truyền tải giữa hệ thống cũ và hệ thống mới thì bị mất dữ liệu . Ví dụ cho việc này khi bạn gửi dùng hệ thống hỗ trợ chuẩn lưu 8 bit gửi mail nếu server mail này dùng chuẩn giao tiếp 7 bit thì việc gửi này có thể dẫn đến việc bit thứ 8 trong byte của bạn sẽ bị “lost”. Hơn nữa còn có vấn đề khác của mail server khi nó được thiết kế để chỉ có thể gửi được ký tự chứ không phải các dữ liệu khác như ảnh , video hay file nén. Bởi vậy bằng một cách thần kỳ những bộ óc thông minh đã triển khai ra một thuật toán để giải quyết các vấn đề trên (chính là base64) . Dĩ nhiên qua thời gian các thuật toán khác xuất hiện nhưng nhờ tính đơn giản , hiệu quả , khả năng linh hoạt base 64 đã trở nên phổ biến nhất và được sử dụng ở khắp mọi nơi "

Định Base64 là gì ?

Cách thức hoạt động của base64

1 : Ta có bảng để mã hóa base64 gồm 3 cột:

index(số thứ tự ) , Binary( đoạn bit đại diện ) , Char( ký tự mã hóa tương ứng với binary đó)

Placeholder

2: Bài toán đưa ra mã hóa base64 đoạn văn sau : “kien”

Bước 1 : Ta phân tích :

Bước 2 : Lập bảng giả lập tính toán (cho mã hóa “kien”)

Placeholder

TH1: chỉ có 16 bit liên tiếp (tương ứng 2 ký tự mỗi ký tự 8 bit) . 12 bit đầu hình thành 2 ký tự mã hóa . dư 4 bit sau mượn thêm 2 bit 0 0 -> để hình thành 1 ký tự mã hóa . vậy còn 1 phần còn lại không có bit để điền vào ta sẽ thay thế với ký tự đặc biệt “pading” là: =

TH2 : chỉ có 8 bit liên tiếp tương ứng 1 ký tự . 6 bit đầu hình thành 1 ký tự mã hóa . dư 2 bit sau mượn thêm 4 bit 0 0 0 0 -> để hình thành 1 ký tự mã hóa . vậy còn 2 phần còn lại không có bit để điền vào ta sẽ thay thế với ký tự đặc biệt “pading” là: ==

(ví dụ với “n” của “kien” hình dưới)

Placeholder

Vậy sau khi lập bảng phân tích ta có mã hóa base64 của “kien” sẽ là: “a2llbg==”

Ứng dụng trong việc mã hóa hình ảnh bằng base 64 và khuyết điểm

Ví dụ mình có một hình ảnh mặt cười như sau sẽ được mã hóa base64 và gửi qua internet :

Placeholder

Ta sẽ dùng tool để kiểm tra image này được hình thành từ các bit như nào và phân tích mẫu 24 bit đầu của ảnh:

Placeholder

Với việc áp dụng công thức lấy 24 bit liên tiếp ta có thể thấy 100010 => i , 010101 => V , 000001 => B , 001110 => O

=> ký tự mã hóa của ảnh đầu tiên sẽ là “iVBO”

Tiếp tục lấy 24 bit tiếp theo cho phần còn lại tương tự như thế để tính .

Các bạn có thể tải ảnh mặt cười bên trên của mình và test thử trên https://base64-image.de

Sẽ có được kết quả base64 dữ liệu sau khi mã hóa khớp với chuỗi đầu là “iVBO” :

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=

Kết luận : Vậy ta có thể tượng tượng như sau khi mã hóa base64 file ảnh. Thực chất là mã hóa các bits cấu thành file ảnh thành các ký tự mã hóa. Ta dùng các ký tự mã hóa này và gửi chúng qua internet.

Sau khi máy tính khác nhận được muốn hiển thị lại dựa vào bảng mã hóa .Phiên dịch các ký tự mã hóa ra thành các bits đại diện cho ký tự đó. Máy tính đọc các bits ảnh và hiển thị ra ảnh .

Khuyết điểm:

Với thuật toán base64 thì trung bình cứ mỗi 6 bit dữ liệu gốc ta tạo ra 1 ký tự( tương đương 8 bit) được lưu trên máy => trung bình 1 bit trước khi sử dụng base64 sẽ tạo 1,33333333 bit mã hóa

Nếu vậy khi ta mã hóa 1 file ảnh 1mb sẽ sinh ra khoảng 1,3333333mb dữ liệu mã hóa ( tương đương cần 1,859,474 ký tự mã hóa)

=> vậy ta có thể thấy khi mã hóa như vậy sẽ không thích hợp với những file dữ liệu lớn trong việc lưu trữ và xử lý

Hoàng Kiên 21/01/2023

Follow me

Theo dõi group trên facebook của mình