{"id":13539795,"url":"https://github.com/dimitarpetrov/stegify","last_synced_at":"2025-05-16T09:06:51.591Z","repository":{"id":41176460,"uuid":"159698099","full_name":"DimitarPetrov/stegify","owner":"DimitarPetrov","description":"🔍 Go tool for LSB steganography, capable of hiding any file within an image.","archived":false,"fork":false,"pushed_at":"2023-04-11T06:07:37.000Z","size":26846,"stargazers_count":1235,"open_issues_count":0,"forks_count":116,"subscribers_count":25,"default_branch":"master","last_synced_at":"2025-05-16T09:06:45.346Z","etag":null,"topics":["cli","decoding","encoding","encoding-library","golang","golang-tools","hiding-in-png","hiding-information","jpeg","png","steganography","steganography-library"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DimitarPetrov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-11-29T16:45:58.000Z","updated_at":"2025-05-15T13:06:25.000Z","dependencies_parsed_at":"2024-01-08T15:34:36.757Z","dependency_job_id":null,"html_url":"https://github.com/DimitarPetrov/stegify","commit_stats":{"total_commits":52,"total_committers":3,"mean_commits":"17.333333333333332","dds":"0.17307692307692313","last_synced_commit":"62518ca9526179e4c539073bc456076623237601"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DimitarPetrov%2Fstegify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DimitarPetrov%2Fstegify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DimitarPetrov%2Fstegify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DimitarPetrov%2Fstegify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DimitarPetrov","download_url":"https://codeload.github.com/DimitarPetrov/stegify/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254501558,"owners_count":22081528,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","decoding","encoding","encoding-library","golang","golang-tools","hiding-in-png","hiding-information","jpeg","png","steganography","steganography-library"],"created_at":"2024-08-01T09:01:32.045Z","updated_at":"2025-05-16T09:06:46.577Z","avatar_url":"https://github.com/DimitarPetrov.png","language":"Go","funding_links":[],"categories":["\u003ca id=\"8f92ead9997a4b68d06a9acf9b01ef63\"\u003e\u003c/a\u003e扫描器\u0026\u0026安全扫描\u0026\u0026App扫描\u0026\u0026漏洞扫描","\u003ca id=\"132036452bfacf61471e3ea0b7bf7a55\"\u003e\u003c/a\u003e工具"],"sub_categories":["\u003ca id=\"1927ed0a77ff4f176b0b7f7abc551e4a\"\u003e\u003c/a\u003e隐私存储"],"readme":"# stegify\n[![Build Status](https://travis-ci.org/DimitarPetrov/stegify.svg?branch=master)](https://travis-ci.org/DimitarPetrov/stegify)\n[![Coverage Status](https://coveralls.io/repos/github/DimitarPetrov/stegify/badge.svg?branch=master)](https://coveralls.io/github/DimitarPetrov/stegify?branch=master)\n[![GoDoc](https://godoc.org/github.com/DimitarPetrov/stegify?status.svg)](https://godoc.org/github.com/DimitarPetrov/stegify)\n[![Go Report Card](https://goreportcard.com/badge/github.com/DimitarPetrov/stegify)](https://goreportcard.com/report/github.com/DimitarPetrov/stegify)\n[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go)  \n\n\n## Overview\n`stegify` is a simple command line tool capable of fully transparent hiding any file within an image or set of images.\nThis technique is known as LSB (Least Significant Bit) [steganography](https://en.wikipedia.org/wiki/steganography) \n\n## Demonstration\n\n| Carrier                                | Data                                | Result                                               |\n| ---------------------------------------| ------------------------------------|------------------------------------------------------|\n| ![Original File](examples/street.jpeg) | ![Data file](examples/lake.jpeg)    | ![Encoded File](examples/test_decode.jpeg)           |\n\nThe `Result` file contains the `Data` file hidden in it. And as you can see it is fully transparent.\n\nIf multiple `Carrier` files are provided, the `Data` file will be split in pieces and every piece is encoded in the respective carrier.\n\n| Carrier1                                     | Carrier2                                   | Data                                       | Result1                                                          | Result2                                                          |\n| ---------------------------------------------|--------------------------------------------|--------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------|\n| \u003cimg src=\"examples/street.jpeg\" width=\"500\"\u003e | \u003cimg src=\"examples/lake.jpeg\" width=\"500\"\u003e | \u003cimg src=\"examples/video.gif\" width=\"500\"\u003e | \u003cimg src=\"examples/test_multi_carrier_decode1.jpeg\" width=\"500\"\u003e | \u003cimg src=\"examples/test_multi_carrier_decode2.jpeg\" width=\"500\"\u003e |\n \nThe `Result1` file contains one half of the `Data` file hidden in it and `Result2` the other. As always fully transparent.\n\n## Installation\n\n#### Installing from Source\n```\ngo install github.com/DimitarPetrov/stegify@latest\n```\n\n#### Installing via Homebrew (macOS)\n```\nbrew tap DimitarPetrov/stegify\nbrew install stegify\n```\n\nOr you can download a binary for your system [here](https://github.com/DimitarPetrov/stegify/releases).\n\n## Usage\n\n### As a command line tool\n\n#### Single carrier encoding/decoding\n```\nstegify encode --carrier \u003cfile-name\u003e --data \u003cfile-name\u003e --result \u003cfile-name\u003e\n\nstegify decode --carrier \u003cfile-name\u003e --result \u003cfile-name\u003e\n```\nWhen encoding, the file with name given to flag `--data` is hidden inside the file with name given to flag\n`--carrier` and the resulting file is saved in new file in the current working directory under the\nname given to flag `--result`.\n\n\u003e **_NOTE:_** The result file won't have any file extension and therefore it should be specified explicitly in `--result` flag. \n\nWhen decoding, given a file name of a carrier file with previously encoded data in it, the data is extracted\nand saved in new file in the current working directory under the name given to flag `--result`.\n\n\u003e **_NOTE:_** The result file won't have any file extension and therefore it should be specified explicitly in `--result` flag.\n\nIn both cases the flag `--result` could be omitted and default values will be used.\n\n#### Multiple carriers encoding/decoding\n\n```\nstegify encode --carriers \"\u003cfile-names...\u003e\" --data \u003cfile-name\u003e --results \"\u003cfile-names...\u003e\"\nOR\nstegify encode --carrier \u003cfile-name\u003e --carrier \u003cfile-name\u003e ... --data \u003cfile-name\u003e --result \u003cfile-name\u003e --result \u003cfile-name\u003e ...\n\nstegify decode --carriers \"\u003cfile-names...\u003e\" --result \u003cfile-name\u003e\nOR\nstegify decode --carrier \u003cfile-name\u003e --carrier \u003cfile-name\u003e ... --result \u003cfile-name\u003e\n```\nWhen encoding a data file in more than one carriers, the data file is split in *N* chunks, where *N* is number of provided carriers.\nEach of the chunks is then encoded in the respective carrier.\n\n\u003e **_NOTE:_** When decoding, carriers should be provided in the **exact** same order for result to be properly extracted. \n\nThis kind of encoding provides one more layer of security and more flexibility regarding size limitations.\n\nIn both cases the flag `--result/--results` could be omitted and default values will be used.\n\n\u003e **_NOTE:_** When encoding the number of the result files (if provided) should be equal to the number of carrier files. When decoding, exactly one result is expected. \n\nWhen multiple carriers are provided with mixed kinds of flags, the names provided through `carrier` flag are taken first and with `carriers/c` flags second.\nSame goes for the `result/results` flag.\n\n\n### Programmatically in your code\n\n`stegify` can be used programmatically too and it provides easy to use functions working with file names\nor raw Readers and Writers. You can visit [godoc](https://godoc.org/github.com/DimitarPetrov/stegify) under\n`steg` package for details.\n\n## Disclaimer\n\nIf carrier file is in jpeg or jpg format, after encoding the result file image will be png encoded (therefore it may be bigger in size)\ndespite of file extension specified in the result flag.\n\n## Showcases\n\n### 🚩 Codefest’19\n\n`stegify` was used for one of the *Capture The Flag* challenges in [**Codefest’19**](https://www.hackerrank.com/codefest19-ctf).\n\nParticipants were given a photo of a bunch of \"innocent\" cats. Nothing suspicious right? Think again!\n\nYou can read more [here](https://medium.com/bugbountywriteup/codefest19-ctf-writeups-a8f4e9b45d1) and [here](https://medium.com/@markonsecurity/image-challenges-1-cats-are-innocent-right-69cd4220bc99). \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdimitarpetrov%2Fstegify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdimitarpetrov%2Fstegify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdimitarpetrov%2Fstegify/lists"}