
🔍 Ferramenta Go para esteganografia LSB, capaz de esconder qualquer arquivo dentro de uma imagem.
stegify é uma ferramenta de linha de comando simples capaz de ocultar de forma totalmente transparente qualquer arquivo dentro de uma imagem ou conjunto de imagens.
Essa técnica é conhecida como LSB (Least Significant Bit) esteganografia
| Portador | Dados | Resultado |
|---|---|---|
![]() | ![]() | ![]() |
O arquivo Resultado contém o arquivo Dados oculto nele. E como você pode ver, é totalmente transparente.
Se vários arquivos Portadores forem fornecidos, o arquivo Dados será dividido em partes e cada parte será codificada no respectivo portador.
| Portador1 | Portador2 | Dados | Resultado1 | Resultado2 |
|---|---|---|---|---|
![]() |
O arquivo Resultado1 contém metade do arquivo Dados oculto nele e Resultado2 a outra metade. Como sempre, totalmente transparente.
go install github.com/DimitarPetrov/stegify@latest
brew tap DimitarPetrov/stegify
brew install stegify
Ou você pode baixar um binário para seu sistema aqui.
stegify encode --carrier <nome-do-arquivo> --data <nome-do-arquivo> --result <nome-do-arquivo>
stegify decode --carrier <nome-do-arquivo> --result <nome-do-arquivo>
Ao codificar, o arquivo com o nome fornecido à flag --data é ocultado dentro do arquivo com o nome fornecido à flag
--carrier e o arquivo resultante é salvo em um novo arquivo no diretório de trabalho atual com o
nome fornecido à flag --result.
NOTA: O arquivo de resultado não terá extensão de arquivo e, portanto, deve ser especificado explicitamente na flag
--result.
Ao decodificar, dado um nome de arquivo de um portador com dados previamente codificados, os dados são extraídos
e salvos em um novo arquivo no diretório de trabalho atual sob o nome fornecido à flag --result.
NOTA: O arquivo de resultado não terá extensão de arquivo e, portanto, deve ser especificado explicitamente na flag
--result.
Em ambos os casos, a flag --result pode ser omitida e valores padrão serão usados.
stegify encode --carriers "<nomes-dos-arquivos...>" --data <nome-do-arquivo> --results "<nomes-dos-arquivos...>"
OU
stegify encode --carrier <nome-do-arquivo> --carrier <nome-do-arquivo> ... --data <nome-do-arquivo> --result <nome-do-arquivo> --result <nome-do-arquivo> ...
stegify decode --carriers "<nomes-dos-arquivos...>" --result <nome-do-arquivo>
OU
stegify decode --carrier <nome-do-arquivo> --carrier <nome-do-arquivo> ... --result <nome-do-arquivo>
Ao codificar um arquivo de dados em mais de um portador, o arquivo de dados é dividido em N pedaços, onde N é o número de portadores fornecidos. Cada um dos pedaços é então codificado no respectivo portador.
NOTA: Ao decodificar, os portadores devem ser fornecidos na mesma ordem exata para que o resultado seja extraído corretamente.
Esse tipo de codificação oferece mais uma camada de segurança e mais flexibilidade em relação a limitações de tamanho.
Em ambos os casos, a flag --result/--results pode ser omitida e valores padrão serão usados.
NOTA: Ao codificar, o número de arquivos de resultado (se fornecidos) deve ser igual ao número de arquivos portadores. Ao decodificar, exatamente um resultado é esperado.
Quando vários portadores são fornecidos com tipos mistos de flags, os nomes fornecidos através da flag carrier são considerados primeiro e os das flags carriers/c em segundo.
O mesmo vale para a flag result/results.
stegify também pode ser usado programaticamente e fornece funções fáceis de usar que trabalham com nomes de arquivos
ou Readers e Writers puros. Você pode visitar godoc no
pacote steg para detalhes.
Se o arquivo portador estiver no formato jpeg ou jpg, após a codificação a imagem do arquivo resultante será codificada em png (portanto, pode ser maior em tamanho) apesar da extensão de arquivo especificada na flag de resultado.
stegify foi usado para um dos desafios Capture The Flag no Codefest’19.
Os participantes receberam uma foto de um monte de gatos "inocentes". Nada suspeito, certo? Pense novamente!
![]() |
![]() |
![]() |
![]() |