Стеганография в тексте: Метод Zero-Width Characters (ZWC)
Стеганография не ограничивается медиафайлами (изображениями или аудио). Одним из самых хитрых и современных методов является использование Невидимых Символов Нулевой Ширины (Zero-Width Characters, ZWC) из стандарта Unicode. Эти символы предназначены для управления форматированием текста (например, для соединения арабских букв), но они не имеют визуального представления при стандартном отображении. Это позволяет использовать их как скрытый бинарный канал внутри обычных текстовых сообщений, постов в социальных сетях или электронных писем.
Как работает ZWC-стеганография?
Метод основан на замене битов 0 и 1 на определенные невидимые символы. Чаще всего используются:
\u200B(Zero Width Space) — для кодирования бита 0.\u200C(Zero Width Non-Joiner) — для кодирования бита 1.\u200D(Zero Width Joiner) — может использоваться как разделитель или стоп-сигнал.
Секретное сообщение преобразуется в бинарный вид (ASCII), а затем каждый бит заменяется соответствующим ZWC. Полученная строка невидимых символов вставляется в любое место открытого текста (например, после первого слова). Визуально текст выглядит абсолютно чистым, но при копировании и программном анализе скрытые символы сохраняются.
Пример кода: ZWC-встраивание и извлечение (Python)
Этот код демонстрирует функции для сокрытия и чтения сообщения с использованием невидимых символов.
# Определяем константы невидимых символов
ZERO = '\u200B' # Zero Width Space
ONE = '\u200C' # Zero Width Non-Joiner
def text_to_bits(text):
"""Преобразует строку в последовательность битов."""
bits = bin(int.from_bytes(text.encode('utf-8'), 'big'))[2:]
return bits.zfill(8 * ((len(bits) + 7) // 8))
def bits_to_text(bits):
"""Преобразует последовательность битов обратно в строку."""
n = int(bits, 2)
return _bytes((n.bit_length() + 7) // 8, 'big').decode('utf-8')
def hide_message(cover_text, secret_message):
"""Встраивает скрытое сообщение в текст-контейнер."""
# 1. Преобразуем секрет в биты
bits = text_to_bits(secret_message)
# 2. Преобразуем биты в невидимые символы
zwc_string = ""
for bit in bits:
if bit == '0':
zwc_string += ZERO
else:
zwc_string += ONE
# 3. Вставляем невидимую строку после первого символа контейнера
# Можно вставлять в случайные места для большей скрытности
if len(cover_text) > 0:
return cover_text[0] + zwc_string + cover_text[1:]
else:
return zwc_string
def extract_message(stego_text):
"""Извлекает скрытое сообщение из текста."""
extracted_bits = ""
found = False
# Проходим по всем символам и ищем наши ZWC
for char in stego_text:
if char == ZERO:
extracted_bits += '0'
found = True
elif char == ONE:
extracted_bits += '1'
found = True
if not found or not extracted_bits:
return "Скрытое сообщение не найдено."
try:
return bits_to_text(extracted_bits)
except Exception:
return "Ошибка декодирования (возможно, данные повреждены)."
# # --- Пример использования ---
# public_text = "Привет, как дела?"
# secret = "Пароль: 12345"
#
# stego = hide_message(public_text, secret)
# print(f"Стего-текст (выглядит обычно): {stego}")
# print(f"Длина стего-текста: {len(stego)} (длиннее оригинала из-за скрытых символов)")
#
# revealed = extract_message(stego)
# print(f"Извлечено: {revealed}")
Преимущества и риски: Этот метод идеален для передачи коротких сообщений через мессенджеры или веб-формы, которые поддерживают Unicode. Однако, многие системы безопасности могут автоматически удалять непечатные символы (sanitization) при обработке данных, что уничтожит сообщение.







