{"id":21629679,"url":"https://github.com/harryr/stegive","last_synced_at":"2025-10-27T06:20:00.318Z","repository":{"id":139181402,"uuid":"75740051","full_name":"HarryR/stegive","owner":"HarryR","description":"Steganographic encrypted archive","archived":false,"fork":false,"pushed_at":"2017-03-31T14:26:45.000Z","size":16,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-24T23:27:24.463Z","etag":null,"topics":["archive","cryptography","encryption","steganography"],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HarryR.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-12-06T14:40:09.000Z","updated_at":"2018-02-22T22:05:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"accf77bf-df4a-4cb5-970c-44fa603b8eaa","html_url":"https://github.com/HarryR/stegive","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HarryR%2Fstegive","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HarryR%2Fstegive/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HarryR%2Fstegive/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HarryR%2Fstegive/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HarryR","download_url":"https://codeload.github.com/HarryR/stegive/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244306652,"owners_count":20431869,"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":["archive","cryptography","encryption","steganography"],"created_at":"2024-11-25T02:08:26.559Z","updated_at":"2025-10-27T06:19:55.285Z","avatar_url":"https://github.com/HarryR.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Encrypted Steganographic Archive\n\n`stegive` lets you pack many datastreams into a single encrypted archive,\nknowing the secret key to extract one datastream gives you no knowledge about \nthe existence of others in the same archive - all that can be determined is \nthat more blocks exist which weren't part of that stream.\n\nExample:\n\n    $ ./pack.py *.c \u003e test.bin\n    $ ./stegive test.bin tweetnacl.c\n\n## Archive Format\n\nArchive Header:\n\n * `nblks` - Total number of blocks in archive\n * `outer_sz` - Size, in bytes, of encrypted block\n * `frame_sz` - Size, in bytes, of decrypted packet / frame\n * `inner_sz` - Max number of data which can be stored per frame\n\nBlock Frame:\n\n * `next` - Next block ID, or 0xFFFFFFFF if EOF\n * ... datastream bytes\n\nStream Header (`bhdr_t`):\n\n * `nblocks` - Total number of blocks\n * `nbytes` - Total number of bytes, spread across blocks\n * `magic` - Equivalent to a mime-type or action identifier\n * ... datastream bytes follow\n\n## Encryption \u0026 Decryption\n\nNaCl secret boxes are used to encrypt and decrypt the contents of blocks. Each\nblock incurs a 16 byte overhead for the Poly1305 MAC.\n\nThe nonce used by the secret box is a SHA512 hash of the secret key for the \ndata stream, concatenated with the current block sequence number and byte \noffset within the datastream. This hash is truncated to 24 bytes. See\n`pack.py::calc_nonce`\n\nTo find the first block of a datastream the nonce is calculated for the secret \nkey using 0 and 0 as the block sequence number and the byte offset. The first \n4 bytes of the nonce are converted to a 32bit unsigned int and modulous'd \nagainst the total number of blocks in the archive. While packing an archive\ncare must be taken that all of the start blocks can be looked up in this way.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharryr%2Fstegive","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fharryr%2Fstegive","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharryr%2Fstegive/lists"}