Стеганография: прятать данные в картинках
Шифрование делает сообщение нечитаемым, но видно, что оно есть. Стеганография идёт дальше: она прячет сам факт сообщения. Письмо как будто и не отправляли.
Шифрование скрывает СОДЕРЖАНИЕ. Стеганография скрывает само СУЩЕСТВОВАНИЕ сообщения.
Древняя идея
Ещё в античности писали на бритой голове раба, ждали, пока отрастут волосы, и отправляли гонца. Использовали невидимые чернила, микроточки. Современная стеганография прячет данные в цифровых файлах — чаще всего в картинках.
Как прячут данные в картинке
Каждый пиксель — это числа яркости цветов (например, красный от 0 до 255). Если изменить самый младший бит числа, цвет сдвинется на единицу — глаз не заметит разницы. В эти младшие биты и записывают тайное сообщение, бит за битом.
# Демонстрация на числах-«пикселях» (без графической библиотеки)
pixels = [120, 200, 50, 90, 255, 33, 18, 240, 64, 130, 77, 199, 12, 211, 5, 160]
def to_bits(text):
bits = []
for ch in text:
bits += [int(b) for b in format(ord(ch), '08b')]
return bits
message = "Hi"
bits = to_bits(message)
print("Секрет в битах:", bits)
# Прячем по одному биту в младший разряд пикселей
stego = list(pixels)
for i, bit in enumerate(bits):
stego[i] = (pixels[i] & ~1) | bit # заменили младший бит
print("Было: ", pixels)
print("Стало:", stego)
print("Пиксели изменились максимум на 1 — глаз не увидит")
Как достать сообщение обратно
stego = [120, 201, 50, 90, 255, 32, 18, 240, 64, 131, 77, 198, 13, 210, 4, 161]
# Собираем младшие биты
bits = [px & 1 for px in stego]
print("Извлечённые биты:", bits)
# Превращаем каждые 8 бит в символ
chars = []
for i in range(0, len(bits) - 7, 8):
byte = bits[i:i+8]
value = int(''.join(str(b) for b in byte), 2)
chars.append(chr(value))
print("Скрытый символ:", ''.join(chars))
Стеганография и шифрование — вместе
У стеганографии есть слабое место: если кто-то знает, что искать, и проанализирует младшие биты, он найдёт сообщение. Поэтому на практике текст сначала шифруют, а потом прячут. Тогда даже если данные найдут, прочитать их без ключа не смогут.
- Шифрование — «я тебе не скажу, что внутри».
- Стеганография — «я даже не признаюсь, что что-то передал».
Стеганографию используют для цифровых водяных знаков (защита авторских прав), но также и злоумышленники для скрытой передачи данных — поэтому исследователи учат системы её обнаруживать (это называется стегоанализ).
Вывод:
Стеганография прячет сам факт сообщения, записывая биты в младшие разряды пикселей — глаз не замечает. Это не шифрование: содержимое не защищено, скрыто лишь его существование. Лучше всего работает в паре с шифрованием.