Giới thiệu

Trước khi triển khai Steganography trong python, chúng ta cần hiểu chính xác Steganography là gì.

Steganography là phương pháp che giấu thông tin trong một dữ liệu rõ, là nghệ thuật và khoa học về việc viết và chuyển tải các thông điệp một cách bí mật, sao cho ngoại trừ người gửi và người nhận, không ai biết đến sự tồn tại của thông điệp.

Nguyên tắc: “Ẩn dấu một thông điệp vô hình trên một vật hữu hình.

Nguyên lý

Nhìn vào hệ thập lục phân (hex) của hình ảnh, chúng ta có thể thấy rằng các tệp png và jpg luôn kết thúc bằng cùng một chuỗi byte cố định.

Nếu dùng Linux, vì vậy chúng ta sẽ kiểm tra với lệnh xxd hoặc hoặc Windows thì dùng hex HxD.

Khi dùng lệnh Linux xem hệ hex của file jpgxxd -i image.jpg hoặc trên Windows

Dù dùng cách nào thì bạn cũng thấy FF và D9 ở cuối cùng, đối với hình ảnh, các nội dung sau FF D9 đều sẽ không được đọc. Do đó ta dễ dàng thêm tin nhắn bí mất vào sau các vị trí này.

Quá trình tương tự có thể được thực hiện với png và chúng ta sẽ thấy kết quả tương tự.

Đối với file png, chuỗi kết thúc bao gồm 12 byte cuối cùng là: 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82.

Triển khai Steganography trên Python

Ở đây mình sử dụng python thuần và không sử dụng các thư viện ngoài.

Bước đầu tiên là tạo một từ điển nhận dạng chứa các chuỗi kết thúc cho để phân biệt giữa file .png và .jpg

file_end = {
    ".png": b'\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82',
    ".jpg": b'\xff\xd9'
}

Đoạn mã  bên dưới mở một tệp ở chế độ “append binary” và ghi nội dung bí mật vào đó.

def append_secret(filename, file_extension, secret):
    with open(f"{filename}{file_extension}", "ab") as f:
        f.write(bytes(secret, encoding="utf-8"))

Tiếp theo hàm giải mã thông tin, nó sẽ tìm vị trí của tệp kết thúc bằng mảng byte. Sau khi tìm thấy vị, nó sẽ giải mã mảng byte từ vị trí đó trở đi (sau vị trí đó là tin nhắn bí mật) và trả về dưới dạng utf-8.

def retrieve_secret(filename, file_extension):
    with open(f"{filename}{file_extension}", 'rb') as f:
        buff = bytes(f.read())
        index = buff.index(file_end[file_extension])
        return buff[index+len(file_end[file_extension]):].decode('utf-8')

Hàm này sẽ đọc nội dung file để tìm vị trí kết thúc của file ảnh, xóa tất cả nội dung ở vị trí vị trí kết thúc của file ảnh (xóa tin nhắn bí mật).

def clear_secret(filename, file_extension):
    with open(f"{filename}{file_extension}", 'rb+') as f:
        buff = bytes(f.read())
        index = buff.index(file_end[file_extension])
        f.truncate(index+len(file_end[file_extension]))

Về cơ bản, chúng ta có 3 tính năng sau:

  • Append: sẽ thêm tin nhắn bí mật vào hình ảnh
  • Retrieve: sẽ hiển thị tin nhắn bí mật
  • Clear: sẽ xóa tin nhắn bí mật

Kết hợp các hàm lại với nhau ta sẽ có một chương trình tin nhắn vào hình ảnh bằng Python hoàn chỉnh:

if __name__=="__main__":
    request = sys.argv[1]
    filename, file_extension = os.path.splitext(sys.argv[2])

    if request == "-a" or request == "--append":
        append_secret(filename, file_extension, sys.argv[3])
    elif request == "-r" or request == "--retrieve":
        secret = retrieve_secret(filename, file_extension)
        print(secret)
    elif request == "-c" or request == "--clear":
        clear_secret(filename, file_extension)
    else:
        print("[!] Incorrect mode selected!")
        sys.exit()

    if not file_extension in file_end:
        print("[!] Image file format not supported!")
        sys.exit()

Cách sử dụng

python main.py <mode> <image> [<message>]
  • Mode: chức năng sử dụng
    • -a: –append
    • -r: –retrieve
    • -c: –clear
  • image: file ảnh
  • message: tin nhắn bí mật (chỉ trong mode a)

Đây là kỹ thuật Steganography giúp ẩn giấy nội dung tin nhắn vào hình ảnh bằng Python, bạn có thể sáng chế thêm việc mã hóa code để người khác khi đọc được nội dung cũng không giải mã được trừ khi có Private Key. Các bạn thử tự áp dụng vào thực tế nhé.

Trích: AnonyViet – website kiến thức về CNTT

Leave a Reply

This site uses cookies to offer you a better browsing experience. By browsing this website, you agree to our use of cookies.