Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Steganography (Giấu tin) dựa trên hình ảnh bằng Python

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:

Steganography (Giấu tin) dựa trên hình ảnh bằng Python

>>> # 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:

Steganography (Giấu tin) dựa trên hình ảnh bằng Python

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

Steganography (Giấu tin) dựa trên hình ảnh bằng Python

>>>
>>> # 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 ☺.