Steganography (Giấu tin) là kỹ thuật ẩn thông tin đằng sau hậu trường. Nó không giống mã hóa (cryptography) tập trung vào mã hóa dữ liệu (qua các thuật toán như SHA1, MD5...), steganography tập trung vào việc ẩn dữ liệu (dữ liệu có thể là file, hình ảnh, tin nhắn hoặc video) bên trong một file, hình ảnh, tin nhắn hoặc video khác để tránh gây chú ý.
Vì vậy, ở đây chúng ta sẽ tạo một chương trình Python đơn giản ẩn thông tin sau hình ảnh mà không có thay đổi nhận thấy được về mặt hình ảnh. Có hai phần chính: hàm giải mã (decoding) trích xuất thông tin bí mật từ file hình ảnh và hàm mã hóa (encoding) nhúng tin nhắn bí mật vào hình ảnh.
Chúng ta dùng thư viện Python Pillow (có thể dùng OpenCV hoặc khác). Cài đặt bằng pip:
$pip install pillow
Khái niệm cơ bản về Pixel và mô hình màu
Pixel là phần tử nhỏ nhất của hình ảnh. Mỗi pixel đại diện cho một phần của hình ảnh gốc. Nghĩa là, pixel càng cao thì biểu diễn càng chính xác.
Trong ảnh đen trắng (không phải grayscale), pixel đen có giá trị 1, pixel trắng giá trị 0. Còn ảnh màu có 3 thành phần màu chính (RGB - Đỏ, Xanh lá, Xanh dương), giá trị pixel 0-255 cho mỗi kênh. Pixel (255, 255, 255) là trắng, (0,0,0) là đen. Vì số tối đa số nhị phân 8-bit biểu diễn được là 255, nên đó là giá trị tối đa.
Vì cơ số nhị phân là 2, ta dễ chuyển nhị phân sang thập phân. Ví dụ nhị phân 01010101, thì thập phân (cơ số 10) là:
2^6 + 2^4 + 2^2 + 2^0 = 64 + 16 + 4 + 1 = 85
Bạn có thể test chuyển đổi nhị phân sang thập phân trong terminal Python:
>>> print(0b01010101) 85 >>> type(0b01010101)>>> 0b01010101 85 >>> 0b01010110 86
Cách thực hiện:
Bước 1: Nhập thư viện/gói cần thiết. Bước 2: Mở file hoặc hình ảnh. Bước 3: Mã hóa văn bản vào hình ảnh nguồn & lưu lại. Bước 4: Kiểm tra cả hai hình ảnh (có và không có dữ liệu ẩn) xem có thay đổi nhìn thấy được không. Bước 5: Giải mã hình ảnh - trích xuất dữ liệu từ hình ảnh.
Triển khai các bước
Mã ví dụ
>>> # Nhập thư viện cần thiết >>> from PIL import Image >>> import stepic >>>
Tôi dùng thư viện stepic để mã hóa và giải mã. Cài stepic bằng pip:

>>> # Mở hình ảnh/file muốn ẩn dữ liệu
>>> im = Image.open('TajMahal.png')
>>>
>>> # Mã hóa văn bản vào file hình ảnh và lưu vào file khác
>>> im1 = stepic.encode(im, b'Hello Python')
>>> im1.save('TajMahal.png', 'PNG')
>>>
>>> # Kiểm tra cả hai hình ảnh xem có thay đổi nhìn thấy được không
>>> im1 = Image.open('TajMahal.png')
>>> im1.show()
Hình ảnh có chứa văn bản ẩn:

Hình ảnh gốc: >>> im.show() >>> '

>>>
>>> # Giải mã hình ảnh để trích xuất dữ liệu ẩn
>>> im2 = Image.open('TajMahal.png')
>>> stegoImage = stepic.decode(im2)
>>> stegoImage
'Hello Python'
Chúng ta thấy việc ẩn văn bản sau hình ảnh rất dễ dàng. Bạn có thể dùng các dữ liệu đầu vào khác như video hoặc định dạng jpeg và dùng thư viện khác cho kết quả tương tự. Chúc bạn thành công với Steganography bằng Python ☺.