II. Các Kỹ Thuật Mã Hóa Cơ Bản (Phần Tiếp Theo)
3. Mã Hóa Base64
Mã hóa Base64 là một kỹ thuật phổ biến trong lĩnh vực mã hóa, cho phép mã hóa đối tượng thành dạng chuỗi ký tự an toàn bằng cách sử dụng bảng mã ASCII. Bảng mã này bao gồm các ký tự từ A-Z, a-z, 0-9, và các ký tự bổ sung như /
và +
, cùng với ký tự đệm =
. So với mã ASCII thông thường, trong mã hóa Base64, một ký tự chỉ cần 6 bit thay vì 8 bit, giúp tiết kiệm không gian lưu trữ.
Để thực hiện quá trình mã hóa từ một đối tượng sang dạng Base64, chúng ta cần thực hiện các bước sau:
- Chuyển đổi đối tượng sang dạng bit.
- Chia chuỗi bit thành từng nhóm 6 bit.
- Chuyển đổi từng nhóm bit thành ký tự tương ứng theo bảng mã Base64.
- Bổ sung ký tự đệm
=
nếu cần thiết.
Ví Dụ Mã Hóa Với Base64
Giả sử chúng ta muốn mã hóa từ Viblo sang dạng Base64:
- Viblo →
01010110
01101001
01100010
01101100
01101111
- Chia thành các nhóm 6 bit:
010101
100110
100101
100010
011011
000110
1111
- Bổ sung thành 7 nhóm:
010101
100110
100101
100010
011011
000110
111100
- Chuyển đổi sang ký tự Base64:
V
m
l
i
b
G
8
Kết quả của quá trình mã hóa từ Viblo sẽ là VmlibG8=
. Quá trình giải mã có thể được thực hiện dễ dàng bằng cách làm ngược lại các bước mã hóa.
Base64 thường được sử dụng để truyền tải các tệp như hình ảnh, âm thanh và video. Tuy nhiên, trong thực tế, Base64 chủ yếu được sử dụng để mã hóa và truyền tải hình ảnh do kích thước của tệp âm thanh và video lớn.
Ví Dụ Mã Nguồn Trong Python
Ngôn ngữ Python hỗ trợ mã hóa Base64 thông qua module base64 với các hàm như base64.b64encode()
để mã hóa và base64.b64decode()
để giải mã.
python
import base64
str = 'Base64_is_amazing'
str_en_b64 = base64.b64encode(str.encode())
print('Base64 encode: ', str_en_b64)
str_de_b64 = base64.b64decode(str_en_b64)
print('Base64 decode: ', str_de_b64)
III. Phép Toán XOR
XOR (Exclusive or) là một phép toán bit, các thao tác được thực hiện ở cấp độ từng bit riêng lẻ. Kết quả của phép toán giữa hai bit tùy thuộc vào mức độ tương đồng của chúng như trong bảng chân lý dưới đây:
A | B | A ⊕ B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Tính chất của phép toán XOR bao gồm: XOR với 0 giữ nguyên giá trị, XOR với chính nó trả về 0, và tính giao hoán và kết hợp. Trong Python, XOR được thực hiện bằng toán tử ^
.
Challenge Luyện Tập: XOR Easy
Chuỗi cipher text đưa ra có thể là một chuỗi hex, và cần thực hiện phép toán XOR cùng một chuỗi key chưa được biết. Chúng ta có thể giải thích rằng key có thể là một ký tự dựa vào hint đã cho.
Có hai cách để tìm ra flag:
Hướng 1: Tấn Công Vét Cạn
Chúng ta có thể thử tất cả các giá trị ASCII cho ký tự key từ 0 đến 255 để tìm ra flag.
python
import time
cipher = '321815130f0c44062b1d072b07441911001c451a4d09'
cipher = bytes.fromhex(cipher).decode()
key = 0
while True:
flag = ''
for i in cipher:
flag += chr(key ^ ord(i))
print('key: %s: flag = %s' % (key, flag))
key += 1
time.sleep(2)
Hướng 2: Tìm Ra Key Dựa Vào Flag
Biết rằng flag bắt đầu bằng Flag{...
, chúng ta có thể tìm ra chuỗi key nhờ vào tính chất XOR:
python
cipher = '321815130f0c44062b1d072b07441911001c451a4d09'
cipher = bytes.fromhex(cipher).decode()
key = chr(ord('F') ^ ord(cipher[0]))
flag = ''
for i in cipher:
flag += chr(ord(key) ^ ord(i))
print(flag)