
Стеганография JPEG
go get lukechampine.com/jsteg
jsteg — это пакет для сокрытия данных внутри jpeg-файлов, метод, известный как стеганография. Это достигается копированием каждого бита данных в наименее значимые биты изображения. Объем скрываемых данных зависит от размера файла jpeg; на каждый байт скрытых данных требуется около 10–14 байт jpeg.
// открываем существующий jpeg
f, _ := os.Open(filename)
img, _ := jpeg.Decode(f)
// добавляем в него скрытые данные
out, _ := os.Create(outfilename)
data := []byte("my secret data")
jsteg.Hide(out, img, data, nil)
// читаем скрытые данные:
hidden, _ := jsteg.Reveal(out)
Обратите внимание, что данные никак не разграничены; вызывающий код сам отвечает за определение того, какие байты из hidden ему нужны. Самый простой способ — добавить длину данных в начале.
Включена команда jsteg, предоставляющая простую обёртку над функциями этого пакета. Она может скрывать и извлекать данные в jpeg-файлах и поддерживает перенаправление ввода/вывода. Она автоматически обрабатывает префиксы длины и использует магический заголовок для идентификации jpeg-файлов, созданных с помощью jsteg.
Также включена более узконаправленная команда slink. slink встраивает открытый ключ в jpeg и упрощает подписание данных и проверку подписей с помощью пар ключей, полученных из строк паролей. Полное описание см. в cmd/slink.
Бинарные файлы обеих команд можно найти здесь.
Этот пакет повторно использует значительный объём кода из пакета image/jpeg. Лицензия BSD-стиля, регулирующая использование этого кода, находится в файле go_LICENSE.