
Независимая от внешних зависимостей библиотека Go для LSB-стеганографии в изображениях: кодирует произвольные файлы в PNG-носители и декодирует скрытые сообщения с предварительной проверкой размера сообщения.
Steganography — это библиотека, написанная на чистом Go, которая позволяет выполнять простую LSB-стеганографию на изображениях. Она способна как кодировать, так и декодировать изображения. Она может хранить файлы любого формата. Эта библиотека вдохновлена Stego от EthanWelsh — утилитой командной строки с той же целью.
go get -u github.com/auyer/steganography
| Оригинал | Закодированное |
|---|---|
![]() | ![]() |
Второе изображение содержит первый абзац описания стегозавра из Википедии, также доступный в examples/message.txt в качестве примера.
package main
import (
"bufio"
"image/png"
"io/ioutil"
"github.com/auyer/steganography"
)
Режим записи используется для того, чтобы взять сообщение и встроить его в файл изображения с помощью LSB-стеганографии, создав секретный файл изображения, который будет содержать ваше сообщение.
Обратите внимание, что минимальный размер изображения — 24 пикселя для одного байта. Для каждого дополнительного байта необходимо ещё 3 пикселя.
inFile, _ := os.Open("input_file.png") // opening file
reader := bufio.NewReader(inFile) // buffer reader
img, _ := png.Decode(reader) // decoding to golang's image.Image
w := new(bytes.Buffer) // buffer that will recieve the results
err := steganography.Encode(w, img, []byte("message")) // Encode the message into the image
if err != nil {
log.Printf("Error Encoding file %v", err)
return
}
outFile, _ := os.Create("out_file.png") // create file
w.WriteTo(outFile) // write buffer to it
outFile.Close()
примечание: все проверки ошибок удалены для краткости, но их следует включать.
Режим длины можно использовать для предварительной проверки изображения-носителя, чтобы определить, файл какого размера он может хранить.
sizeOfMessage := steganography.GetMessageSizeFromImage(img) // retrieves the size of the encoded message
Режим чтения используется для чтения изображения, которое было закодировано с помощью LSB-стеганографии, и извлечения скрытого сообщения из этого изображения.
inFile, _ := os.Open(encodedInputFile) // opening file
defer inFile.Close()
reader := bufio.NewReader(inFile) // buffer reader
img, _ := png.Decode(reader) // decoding to golang's image.Image
sizeOfMessage := steganography.GetMessageSizeFromImage(img) // retrieving message size to decode in the next line
msg := steganography.Decode(sizeOfMessage, img) // decoding the message from the file
fmt.Println(string(msg))
примечание: все проверки ошибок удалены для краткости, но их следует включать.
Полный пример см. в файле examples/stego.go. Это приложение командной строки, основанное на оригинальном форке этого репозитория, но изменённое для использования библиотеки Steganography.