Cập nhật lần cuối:

Steganography - Kỹ thuật ẩn giấu thông điệp bí mật trong văn bản và số ký tự

Khoảng 10 phút đọc

Đoạn văn này ẩn chứa một thông điệp bí mật - nếu ai đó nói với bạn như vậy, bạn sẽ tìm ở đâu? Chữ cái đầu mỗi câu? Khoảng cách giữa các ký tự nhất định? Hay có thể là các ký tự vô hình được nhúng vào? Steganography là nghệ thuật ẩn giấu chính sự tồn tại của thông điệp. Nếu mã hóa làm cho thông điệp "không đọc được," thì steganography làm cho nó "không phát hiện được." Và kỹ thuật này đôi khi có thể được phát hiện thông qua hành động đơn giản là đếm ký tự.

Nghệ thuật "ẩn giấu" từ thời cổ đại

Lịch sử steganography có thể truy ngược đến thế kỷ 5 TCN ở Hy Lạp. Hai câu chuyện mà sử gia Herodotus ghi lại trong Historiai được coi là những ghi chép cổ xưa nhất còn lưu. Câu chuyện thứ nhất: Histiaeus cạo đầu người hầu tin cẩn nhất của mình, khắc thông điệp lên da đầu, chờ tóc mọc lại rồi gửi người này đến chỗ Aristagoras. Bản thân sứ giả không đọc được thứ mình đang mang, còn người nhận lấy ra nội dung chỉ nhờ một chỉ dẫn duy nhất: khi anh ta đến thì hãy cạo đầu anh ta. Câu chuyện thứ hai: Demaratus muốn báo trước kế hoạch tấn công Hy Lạp nên viết trực tiếp lên phần gỗ lót của một tấm bảng sáp, rồi phủ sáp mới lên trên. Bảng viết thời đó là dụng cụ dùng lại nhiều lần bằng cách làm chảy rồi láng lại sáp, nên chỉ cần mặt sáp còn trắng thì không ai nghĩ đến việc xem lớp gỗ bên dưới.

Hai cách ẩn giấu này có tính chất trái ngược nhau. Hình khắc trên da đầu không thể gửi đi trước khi tóc mọc lại, nhưng dù bị kiểm tra dọc đường cũng không có chữ nào lộ ra. Tấm bảng sáp gửi đi được ngay, song chỉ cần gạt lớp sáp là mọi thứ phơi ra trong một nhát. Sự đánh đổi giữa "khó bị phát hiện" và "truyền đi nhanh" lặp lại đúng nguyên hình trong các kỹ thuật số hiện đại nói ở phần sau.

Về sau, những cách ẩn giấu bằng vật lý vẫn được dùng rất lâu: mực vô hình (nước chanh, sữa, nước tiểu, v.v.) hay việc đan mã Morse vào cuộn sợi len mà người mang giữ trên người. Sang thế kỷ 20 xuất hiện vi điểm - ảnh thu nhỏ của một tài liệu. Thu về một hình tròn đường kính khoảng 1 milimét, nó không phân biệt được với dấu chấm in hay dấu chấm trên chữ i thường, và có thể đi qua đường bưu chính thông thường y như vậy. Phương pháp này trước tiên được dùng ở Đức giữa hai cuộc thế chiến, sau đó nhiều nước khác cũng áp dụng để đưa tài liệu qua các tuyến bưu chính bị kiểm duyệt.

Các kỹ thuật Steganography dựa trên văn bản

Steganography văn bản thời đại kỹ thuật số có một số kỹ thuật đại diện.

Acrostic - Thông điệp ẩn trong chữ cái đầu

Acrostic là kỹ thuật mà khi nối chữ cái đầu mỗi dòng hoặc câu sẽ hiện ra thông điệp bí mật. Đây là hình thức steganography văn bản cổ điển nhất, được sử dụng trong thơ ca từ thời cổ đại.

Một trường hợp thực sự gây rắc rối là thông điệp phủ quyết mà Thống đốc California Arnold Schwarzenegger đưa ra vào tháng 10 năm 2009 đối với một dự luật do nghị sĩ bang Tom Ammiano trình. Đọc dọc từ trên xuống, chữ cái đầu của các dòng thứ ba đến thứ chín trong thông điệp ghép thành một câu thô tục. Phía thống đốc giải thích đó là sự trùng hợp, nhưng các nhà toán học phản biện rằng về mặt thống kê rất khó tin đó chỉ là trùng hợp. Điều vụ việc này cho thấy là chỗ khó xử của acrostic không nằm ở sự tinh xảo khi nhúng, mà ở việc ngoài chính tác giả thì không ai xác định được đó là vô tình hay hữu ý.

Acrostic nhúng được thông điệp mà không làm tăng số ký tự, nhưng lượng thông tin nó chở được bị ràng buộc vào số dòng. Một đoạn văn 10 dòng chỉ ẩn được 10 chữ cái, mà mỗi dòng lại buộc phải mở đầu bằng một chữ cái đã định trước nên câu chữ dễ trở nên gượng gạo. Thêm vào đó, bất kỳ ai nghĩ đến việc đọc dọc các chữ cái đầu đều tìm ra được, nên mức độ bí mật của nó thấp hơn nhiều so với các kỹ thuật hiện đại.

Thao tác khoảng trắng

Kỹ thuật nhúng thông tin bit bằng cách thao tác số lượng dấu cách giữa các từ. 1 dấu cách biểu thị "0," 2 dấu cách biểu thị "1," mã hóa dữ liệu nhị phân. Sự khác biệt tinh tế về khoảng cách khó nhận ra bằng mắt thường, nhưng công cụ đếm ký tự có thể phát hiện "có quá nhiều dấu cách so với số từ nhìn thấy."

Steganography ký tự zero-width - Thế giới ký tự vô hình

Kỹ thuật steganography văn bản mạnh nhất hiện đại sử dụng ký tự vô hình zero-width. Unicode định nghĩa nhiều "ký tự zero-width" không hiển thị trên màn hình nhưng tồn tại dưới dạng dữ liệu ký tự.

Mã UnicodeTênMục đích ban đầuVai trò trong Steganography
U+200BZero Width SpaceChỉ định vị trí ngắt dòngBiểu thị bit "0"
U+200CZero Width Non-JoinerNgăn chặn chữ ghépBiểu thị bit "1"
U+200DZero Width JoinerThúc đẩy chữ ghépGiá trị bit bổ sung
U+FEFFZero Width No-Break Space (BOM)Dấu thứ tự byteKý tự phân cách

Sử dụng 2 loại ký tự zero-width U+200B và U+200C, có thể biểu thị 1 bit với 2 giá trị (0 và 1). 8 ký tự zero-width tạo thành 1 byte, tức 1 ký tự ASCII. Ẩn thông điệp 5 ký tự "Hello" cần 40 ký tự zero-width.

Phân tán 40 ký tự zero-width này giữa các từ trong văn bản bình thường, ngoại hình hoàn toàn không thay đổi. Tuy nhiên, so sánh "số ký tự nhìn thấy" với "số điểm mã thực tế" bằng công cụ đếm ký tự sẽ phát hiện sự khác biệt bất thường. Trong UTF-8, mỗi ký tự zero-width chiếm 3 byte, nên chính 40 ký tự đó cũng hiện ra thành 120 byte tăng thêm. Hiểu kiến thức cơ bản về Unicode giúp xác định nguyên nhân là ký tự zero-width.

Ví dụ triển khai Steganography ký tự zero-width

Hãy xem quy trình nhúng cụ thể. Xét trường hợp ẩn thông điệp bí mật "Hi" trong văn bản bình thường "Good morning."

"H" có mã ASCII 72, nhị phân 01001000. "i" là 105, nhị phân 01101001. Chuyển 0 thành U+200B (zero-width space) và 1 thành U+200C (zero-width non-joiner) tạo ra chuỗi 16 ký tự zero-width.

Chèn 16 ký tự zero-width này giữa "Good" và "morning." Ngoại hình vẫn là "Good morning" nhưng dữ liệu thực chứa 16 ký tự vô hình. Trình soạn thảo đếm 12 ký tự, nhưng đếm bằng chương trình cho 28 mã Unicode. Chênh lệch 16 ký tự chính là thông điệp ẩn.

Triển khai nâng cao hơn sử dụng 3 loại ký tự zero-width trở lên cho mã hóa tam phân hoặc cao hơn. Dùng U+200B, U+200C, U+200D thì mỗi ký tự chở được log₂3 ≒ 1,58 bit, nên về lý thuyết 8 bit thông tin gói vừa trong 5,05 ký tự. Tuy nhiên khi triển khai thì phải làm tròn lên. Năm ký tự lấy từ 3 loại chỉ cho 3 mũ 5 = 243 tổ hợp, không phủ nổi 256 giá trị của 1 byte, nên thực tế phải dùng 6 ký tự (3 mũ 6 = 729 tổ hợp). Từ 8 ký tự của phương thức 2 giá trị xuống còn 6 ký tự, tức rút ngắn 25 %.

Tấn công Homoglyph - Ký tự khác nhau trông giống hệt

Homoglyph là các ký tự trông gần như giống hệt nhau nhưng có mã Unicode khác nhau. Ví dụ, chữ Latin "a" (U+0061) và chữ Cyrillic "а" (U+0430) trông hoàn toàn giống nhau trong nhiều phông chữ.

Ký tự LatinMãKý tự CyrillicMãKhác biệt thị giác
aU+0061аU+0430Gần như giống hệt
eU+0065еU+0435Gần như giống hệt
oU+006FоU+043EGần như giống hệt
pU+0070рU+0440Gần như giống hệt
cU+0063сU+0441Gần như giống hệt

Tấn công homoglyph khai thác đặc tính này. Thay "a" trong "apple.com" bằng chữ Cyrillic "а" trong URL lừa đảo trông giống hệt nhưng chuyển hướng đến tên miền hoàn toàn khác. Trong steganography, thay thế ký tự cụ thể bằng homoglyph nhúng thông tin bit.

Phát hiện homoglyph cần kiểm tra mã Unicode của mỗi ký tự. Như thảo luận trong độ dài mật khẩu và bảo mật, trường hợp ngoại hình giống nhau nhưng chuỗi byte khác nhau tạo ra rủi ro bảo mật nghiêm trọng.

Để đối phó, các trình duyệt chính hạn chế hiển thị IDN (Tên miền quốc tế hóa). Khi tên miền trộn lẫn nhiều hệ chữ viết, trình duyệt hiển thị tên miền dạng Punycode (định dạng mã hóa bắt đầu bằng xn--) để cảnh báo người dùng. Firefox áp dụng cách kiểm tra này từ phiên bản 22, Chrome từ phiên bản 51, còn Safari hiển thị các tập ký tự có vấn đề dưới dạng Punycode.

Công nghệ watermark văn bản

Là ứng dụng của steganography, công nghệ watermark kỹ thuật số cho văn bản tồn tại. Dù watermark hình ảnh và video được biết rộng rãi, kỹ thuật nhúng watermark vào văn bản cũng có.

Phương pháp watermarkNguyên lýPhương pháp phát hiệnKhả năng chống chịu
Nhúng ký tự zero-widthLưu thông tin bit trong ký tự vô hìnhĐếm ký tựCó thể mất khi sao chép-dán
Thay thế từ đồng nghĩa"lớn" → "to lớn" thay thế đồng nghĩaSo sánh với bản gốcChống chịu tốt với chỉnh sửa
Chuyển đổi cú phápChủ động → bị động chuyển đổi cú phápSo sánh với bản gốcChống chịu tốt với chỉnh sửa
Thao tác khoảng trắngThao tác số lượng dấu cách và tabPhân tích thống kê khoảng trắngMất khi thay đổi định dạng

Watermark thay thế từ đồng nghĩa nhúng thông tin bit mà không thay đổi nghĩa văn bản. Phương pháp này có thể thay đổi số ký tự nhưng chống chịu tốt với chỉnh sửa và sao chép-dán.

Mã hóa vs. Steganography

Mã hóa và steganography thường bị nhầm lẫn nhưng là công nghệ khác nhau về cơ bản.

Đặc tínhMã hóaSteganography
Mục đíchLàm nội dung không đọc đượcẨn sự tồn tại của thông điệp
Khả năng phát hiệnSự tồn tại của bản mã rõ ràngSự tồn tại của thông điệp không được biết
Ảnh hưởng đến số ký tựTương đương văn bản gốcSố ký tự văn bản che có thể tăng
Yêu cầu khóaCần khóa để giải mãCó thể trích xuất nếu biết kỹ thuật
Kết hợpCó thể dùng đơn lẻKết hợp với mã hóa thì nội dung vẫn được bảo vệ dù đã bị phát hiện

Cách tiếp cận an toàn nhất là mã hóa thông điệp rồi ẩn bằng steganography. Ngay cả khi steganography bị phá và sự tồn tại của thông điệp bị phát hiện, nội dung vẫn không đọc được nếu đã mã hóa.

Phát hiện Steganography qua đếm ký tự

Phương pháp đơn giản nhất để phát hiện steganography văn bản là đếm ký tự. Các bất thường sau đây là gợi ý phát hiện.

Không khớp giữa số ký tự nhìn thấy và số ký tự thực tế (số mã). Khi nhúng ký tự zero-width, số ký tự nhìn thấy trong trình soạn thảo ít hơn số đếm bằng chương trình. Ví dụ, văn bản trông 100 ký tự nhưng thực chứa 180 ký tự dữ liệu, có thể 80 ký tự zero-width đã được nhúng.

Kích thước mã hóa ký tự bất thường cũng là manh mối. Văn bản ASCII thuần (chỉ chữ số) trong UTF-8 phải là 1 ký tự = 1 byte. Nhưng nếu trộn homoglyph Cyrillic, một số ký tự trông ASCII trở thành 2 byte.

Đếm ký tự và ký tự zero-width trên Twitter (nay là X)

Thư viện đếm ký tự "twitter-text" mà Twitter (nay là X) dùng gán cho mỗi ký tự một trọng số, rồi xét tổng trọng số có nằm trong giới hạn 280 hay không để quyết định bài đăng được phép hay không. Trong cấu hình của nó, trọng số mặc định là 2, và chỉ một vài khoảng như U+0000 đến U+10FF hay U+2000 đến U+200D được định nghĩa với trọng số 1. Zero-width space (U+200B), zero-width non-joiner (U+200C) và zero-width joiner (U+200D) đều nằm trong khoảng trọng số 1, nên dù không hiện gì trên màn hình, mỗi ký tự vẫn ăn một suất của định mức. U+FEFF nằm ngoài khoảng đó nên được đếm theo trọng số mặc định là 2.

Kết quả là bài đăng giấu thông tin bằng ký tự zero-width luôn "dài" hơn vẻ ngoài của nó. Phương thức 2 giá trị cần 8 ký tự zero-width cho mỗi ký tự của thông điệp bí mật, nên dồn toàn bộ định mức 280 vào đó cũng chỉ chở được 35 ký tự, trừ phần văn bản che thì còn ít hơn nữa. Chính giới hạn số ký tự đang đóng vai trò giới hạn dung lượng cho steganography ký tự zero-width.

Công cụ và kỹ thuật phát hiện Steganography

Có một số công cụ và kỹ thuật chuyên dụng để phát hiện steganography văn bản.

Phương pháp phát hiệnMục tiêuNguyên lýHạn chế
So sánh số ký tự vs byteKý tự zero-widthKhông khớp giữa số nhìn thấy và byte thựcKhó phân biệt với ký tự zero-width hợp lệ
Phân tích danh mục UnicodeHomoglyphXác minh tính nhất quán khối UnicodeNhiều dương tính giả trong văn bản đa ngữ
Phân tích thống kêThao tác khoảng trắngXác minh phân bố dấu cách phù hợp thống kê ngôn ngữ tự nhiênĐộ chính xác thấp cho văn bản ngắn
Phân tích entropyTổng quátXác minh entropy thông tin trong phạm vi ngôn ngữ tự nhiênKhó đối phó kỹ thuật nâng cao

Phương pháp phát hiện đơn giản và hiệu quả nhất là sao chép-dán văn bản thành plain text rồi so sánh số byte với bản gốc. Nếu chứa ký tự zero-width hoặc homoglyph, số byte sẽ khác nhau.

Rủi ro thực tế mà ký tự zero-width mang lại

Ký tự zero-width gây rắc rối dưới dạng "lẫn vào ngoài ý muốn" trước cả khi nó được dùng để liên lạc bí mật có chủ đích. Văn bản sao chép từ một trang web mang theo một ký tự zero-width lạc vào, rồi từ khóa tìm kiếm không khớp, việc đối chiếu định danh không thông, hoặc ô nhập liệu báo vượt giới hạn số ký tự. Vì bề ngoài giống nhau hoàn toàn, có ngồi nhìn bao lâu cũng không ra nguyên nhân. Điều quyết định là có nhận ra "số ký tự nhìn thấy" và số điểm mã không khớp nhau hay không.

Chính tính chất đó cũng dùng được để theo dấu. Nếu mỗi bản tài liệu phát ra được gài một chuỗi ký tự zero-width khác nhau, bản đó mang sẵn một dấu nhận biết nơi nhận mà hình thức không đổi chút nào - đó là ý tưởng của "dấu vân tay tài liệu". Đọc chuỗi này ra từ một tài liệu bị rò rỉ thì khoanh được nó xuất phát từ bản nào. Tuy vậy ký tự zero-width có thể bị lược đi trên đường sao chép-dán hoặc qua các xử lý chuẩn hóa văn bản, nên dấu còn lại được đến đâu là tùy vào đường mà nó đi qua.

Bản thân steganography không nghiêng về phía thiện hay phía ác. Nó vừa có thể che sự tồn tại của một liên lạc để bảo vệ người gửi, vừa có thể xóa dấu vết của người mang thông tin ra ngoài. Nhìn từ phía nào thì việc đối chiếu đơn giản giữa "số ký tự nhìn thấy" với số điểm mã và số byte thực tế vẫn là điểm tựa đầu tiên để chạm tới những gì đã bị giấu.

Chia sẻ bài viết này