Saturday, 26 September 2015

base64 encoding

Loạt bài viết giới thiệu về các khái niệm liên quan đến việc chuyển hoá dữ liệu thành 1 dạng khác (encode), và chuyển ngược lại (decode).

Các từ khoá:
- encode/decode <verb>
- encoding/decoding <noun> việc "encode"/"decode"
- data encoding

Base64, Base32, Base16
- tên các thuật toán để encode và decode các chuỗi nhị phân tuỳ ý (binary string) thành dạng text tương ứng.
- Tại sao lại là 64? vì nó sử dụng 64 ký tự để biểu diễn. [A-Za-z0-9+/] là 26 + 26 + 10 + 2 = 64. Ngoài ra có ký tự "=" dùng để đệm (pad).
- Có biến thể khác sử dụng dấu -_ thay cho +/, dùng trong xử lý URL và filename

Tương tự, Base32 sử dụng bảng chữ cái [A-Z2-7] = 26 + 6 = 32
Base16 còn gọi là hex - sử dụng các ký tự [0-9A-F] = 10 + 6 = 16

Trên terminal, dùng lệnh base64 để encode một chuỗi bất kỳ thành dạng "Base64":
$ printf "FAMILUG" | base64
RkFNSUxVRw==
Python2.7 (sử dụng ipython):
In [3]: import base64
In [7]: base64.b64encode("FAMILUG")
Out[7]: 'RkFNSUxVRw==' 
Lấy 10 bytes từ urandom (/dev/urandom - nguồn sinh các byte ngẫu nhiên trên máy tính *NIX), encode thành dạng Base64:

Trên shell:
$ head -c 10 /dev/urandom  | base64
jqzfTmmXzjxBIA==
IPython:
In [14]: base64.b64encode(os.urandom(10))
Out[14]: 'LeFms9KzU8DSxg=='
Tham khảo:
baseN: http://www.ietf.org/rfc/rfc4648.txt