Bộ mã ascii mã hóa dược bao nhiêu kí tự

Trong bài viết này, mình sẽ giới thiệu với mọi người về khái niệm Encoding, phân biệt nó với Encryption [Thứ mà nếu có điều kiện mình sẽ cùng chia sẻ trong những bài viết sau], sau đó đi qua 2 ví dụ với Base64 và Ascii85.

Ý định cơ bản của mình khi viết bài này là giới thiệu về phương pháp mã hoá Base64, hay nói đúng theo trên Wikipedia là về một nhóm encoding schemes na ná nhau gọi chung là Base64. Trong quá trình lựa chọn nội dung trình bày, mình quyết định đưa bài viết đi xa hơn mục đích ban đầu của nó một chút, xuất phát từ việc nhận ra Base64, vốn dĩ là một phương pháp Encoding lại thường xuyên bị nhầm thành Encryption.

Hãy xem chính xác thì Wikipedia nói gì về Base64:

Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation. The term Base64 originates from a specific MIME content transfer encoding.

Không phải lúc nào Wikipedia cũng đáng tin, nhưng hãy tin khi nó nói Base64 là một [đống] phương pháp Encoding, cụ thể là binary-to-text encoding. Bạn dịch từ này thế nào? Mã Hoá? Khốn thay còn một thuật ngữ khác có cách đọc [và ý nghĩa] khác hẳn mà cũng có thể dịch ra tiếng Việt là Mã Hoá: Encryption.

I. Encoding và Encryption.

Không chỉ người Việt bối rối với 2 từ Mã Hoá và Mã Hoá, các đồng chí Tây cũng bối rối với Encoding và Encryption luôn. Thỉnh thoảng mình thấy bọn hắn dùng encryption và encoding loạn hết cả lên, các thành viên của Stackoverflow cũng nhiều lần phải copy paste câu trả lời giải thích sự khác nhau giữa hai thuật ngữ này từ câu hỏi này sang câu hỏi khác, từ ngày tháng này qua ngày tháng khác. Có thể tìm thấy nhiều định nghĩa, so sánh rất dài về Encryption và Encoding, nhưng ngắn gọn, chúng khác biệt nhau một cách cơ bản về mục đích sử dụng.

Encryption là quá trình chuyển đổi giữ liệu nhằm mục đích tăng cường bảo mật, giữ bí mật thông tin, đảm bảo chỉ người có thẩm quyền mới có thể xem được.
Encoding là quá trình chuyển dữ liệu từ định dạng này sang một định dạng khác nhằm mục đích sử dụng dữ liệu trong các hệ thống khác nhau.

Encryption thường đi kèm với khái niệm key, biết thuật toán encrypt là gì mà không có key thì đừng hòng dịch ra được. Nhiều khi key để mã hoá và key để giải mã còn khác nhau [public/ private key], thành thử chính mình mã hoá mà mình cũng không dịch lại được luôn, phải để người nhận dùng private key dịch.

Encoding thì khác, mục đích nó sinh ra là để giúp các hệ thống khác nhau giao tiếp được với nhau, sử dụng thuật toán và bảng mã công khai. ASCII chính là một phương pháp encoding ánh xạ 1 chuỗi 7 bit nhị phân [sau này là 8 bit] thành 128 ký tự [với 8 bit thì là 256 ký tự].

Các phương pháp binary-to-text encoding thì tìm cách biểu diễn dữ liệu nhị phân dưới dạng một số ký tự trong bảng mã ASCII, thông thường nằm trong 95 ký tự có-thể-in [printable]. Cụ thể với Base64 là sẽ chuyển những từng nhóm 6 bit nhị phân thành một trong số 64 ký tự được chọn trước từ bảng mã ASCII.

Việc chuyển đổi này là cần thiết nếu muốn truyền dữ liệu qua những giao thức cũ không chấp nhận binary data, ví dụ như email, hoặc khi ta muốn truyền những ký tự đặc biệt sang đầu bên kia, mà giao thức ta dùng không cho phép sử dụng ký tự ấy. Khi dữ liệu đã truyền hoàn toàn qua giao thức, đầu bên kia chỉ việc giải mã để nhận về dữ liệu ban đầu.

Trước những năm đầu 90, rất nhiều hệ thống hoặc giao thức giả định rằng mỗi ký tự biểu diễn bởi một số nguyên từ 0 đến 127, tức từ 7 bit [Thường encode bằng bảng ASCII 7 bit 128 ký tự]. Bit cuối cùng còn lại trong byte được dùng làm meta data control bit trong giao thức, hoặc làm flag bit, hoặc dùng để đánh dấu xem số bit 1 trong 7 bit còn lại là chẵn hay lẻ giúp phát hiện byte lỗi.

Những hệ thống ngày nay thường là 8-bit clean, tức sử dụng 8 bit để mã hoá thành một ký tự, bằng cách chuyển những ký tự này thành từng byte binary data rồi dùng các mã hoá bằng phương pháp khác, ví dụ Base64 sử dụng 1 ký tự đại diện cho 6 bit, ta có thể truyền dữ liệu qua các hệ thống/ giao thức cũ hay thậm chí với những hệ thống mà 1 byte không bằng 8 bit.

II. Base64

Ý tưởng của Base64 tương đối đơn giản. Giả sử ta cần chuyển đổi các ký tự từ bảng mã ASCII 8 bit sang Base64, thay vì mã hoá 8 bit thành một ký tự [tổng cộng 28 = 256 ký tự có thể biểu diễn] , ta chỉ sử dụng 6 bit [tổng cộng 26 = 64 ký tự có thể biểu diễn]. Vì bội chung nhỏ nhất của 6 và 8 là 24, với mỗi nhóm 3 ký tự 8 bit, sau chuyển đổi ta thu được 4 ký tự 6 bit. Số lượng ký tự sau mã hoá tăng 4/3 lần.

Cùng đến với ví dụ trên Wikipedia cho dễ hiểu:

Với từ

0, mã ASCII lần lượt là

1,

2,

3. Biểu diễn dưới dạng nhị phân là

4,

5,

6. Nhóm thành từng nhóm 6 bit, ta có

7,

8,

9,

845 = 4,182,119,424

Chủ Đề