steganan


Namesteganan JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummarySteganography in floating point data with NaN payloads
upload_time2025-07-15 03:47:31
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords python
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # steganan

[![PyPI - Version](https://img.shields.io/pypi/v/steganan)](https://pypi.org/project/steganan/)
[![Release](https://img.shields.io/github/v/release/kjordahl/steganan)](https://github.com/kjordahl/steganan/releases)
[![Build status](https://img.shields.io/github/actions/workflow/status/kjordahl/steganan/main.yml?branch=main)](https://github.com/kjordahl/steganan/actions/workflows/main.yml?query=branch%3Amain)
[![License](https://img.shields.io/github/license/kjordahl/steganan)](https://github.com/kjordahl/steganan/blob/main/LICENSE)

Steganography in floating point data with NaN payloads

- **Github repository**: <https://github.com/kjordahl/steganan/>

Do you have not-a-number values in your floating point data that
you're not making full use of?  Have you ever pondered what to do with
all of those wasted bits? Steganan may be for you!  Encode whatever
data you like into those spare bits! Most programs won't even notice
the difference. Save them out to a file if you like. As long as your
file format preserves the full floating point values, you can get your
hidden data back!

Want to add compression and/or encryption of your data? That is
certainly possible, but is left as an exercise for the user.

## Examples

### Storing image data in an array of NaN values

```
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> from skimage.data import astronaut
>>> import steganan
>>> img = astronaut()
>>> print(img.shape)
(512, 512, 3)
>>> a = steganan.encode_array(img, stack=True, dtype=np.float64)
>>> print(a)
[[nan nan nan ... nan nan nan]
 [nan nan nan ... nan nan nan]
 [nan nan nan ... nan nan nan]
 ...
 [nan nan nan ... nan nan nan]
 [nan nan nan ... nan nan nan]
 [nan nan nan ... nan nan nan]]
>>> decoded = steganan.decode_array(a, stack=True, depth=3)
>>> plt.figure(figsize=(4, 4))
>>> plt.imshow(decoded)
```
![decoded.png](https://github.com/kjordahl/steganan/raw/refs/heads/main/data/decoded.png)

### Hiding data in an existing floating point array

```
>>> import rasterio as rio
>>> src = rio.open("data/modis_aod_06_2025.tif")
>>> a = src.read(1)
>>> steganan.write_str_to_nans(a, "I have a secret!")
>>> plt.imshow(a, cmap='inferno_r', vmin=0, vmax=1.0)
```
![encoded.png](https://github.com/kjordahl/steganan/raw/refs/heads/main/data/encoded.png)
```
>>> message = steganan.retrieve_string_from_payloads(a)
>>> print(message)
I have a secret!
```

### Notebook example

See [lightning talk slides](https://github.com/kjordahl/steganan/blob/main/slides/talk.ipynb).

---

Repository initiated with [fpgmaas/cookiecutter-uv](https://github.com/fpgmaas/cookiecutter-uv).

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "steganan",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "python",
    "author": null,
    "author_email": "Kelsey Jordahl <kjordahl@alum.mit.edu>",
    "download_url": "https://files.pythonhosted.org/packages/50/fd/4aaf8a8006ffd93627b9af986b43d09a4a4c5e1a07aab833a82aacac7fa0/steganan-0.2.0.tar.gz",
    "platform": null,
    "description": "# steganan\n\n[![PyPI - Version](https://img.shields.io/pypi/v/steganan)](https://pypi.org/project/steganan/)\n[![Release](https://img.shields.io/github/v/release/kjordahl/steganan)](https://github.com/kjordahl/steganan/releases)\n[![Build status](https://img.shields.io/github/actions/workflow/status/kjordahl/steganan/main.yml?branch=main)](https://github.com/kjordahl/steganan/actions/workflows/main.yml?query=branch%3Amain)\n[![License](https://img.shields.io/github/license/kjordahl/steganan)](https://github.com/kjordahl/steganan/blob/main/LICENSE)\n\nSteganography in floating point data with NaN payloads\n\n- **Github repository**: <https://github.com/kjordahl/steganan/>\n\nDo you have not-a-number values in your floating point data that\nyou're not making full use of?  Have you ever pondered what to do with\nall of those wasted bits? Steganan may be for you!  Encode whatever\ndata you like into those spare bits! Most programs won't even notice\nthe difference. Save them out to a file if you like. As long as your\nfile format preserves the full floating point values, you can get your\nhidden data back!\n\nWant to add compression and/or encryption of your data? That is\ncertainly possible, but is left as an exercise for the user.\n\n## Examples\n\n### Storing image data in an array of NaN values\n\n```\n>>> import matplotlib.pyplot as plt\n>>> import numpy as np\n>>> from skimage.data import astronaut\n>>> import steganan\n>>> img = astronaut()\n>>> print(img.shape)\n(512, 512, 3)\n>>> a = steganan.encode_array(img, stack=True, dtype=np.float64)\n>>> print(a)\n[[nan nan nan ... nan nan nan]\n [nan nan nan ... nan nan nan]\n [nan nan nan ... nan nan nan]\n ...\n [nan nan nan ... nan nan nan]\n [nan nan nan ... nan nan nan]\n [nan nan nan ... nan nan nan]]\n>>> decoded = steganan.decode_array(a, stack=True, depth=3)\n>>> plt.figure(figsize=(4, 4))\n>>> plt.imshow(decoded)\n```\n![decoded.png](https://github.com/kjordahl/steganan/raw/refs/heads/main/data/decoded.png)\n\n### Hiding data in an existing floating point array\n\n```\n>>> import rasterio as rio\n>>> src = rio.open(\"data/modis_aod_06_2025.tif\")\n>>> a = src.read(1)\n>>> steganan.write_str_to_nans(a, \"I have a secret!\")\n>>> plt.imshow(a, cmap='inferno_r', vmin=0, vmax=1.0)\n```\n![encoded.png](https://github.com/kjordahl/steganan/raw/refs/heads/main/data/encoded.png)\n```\n>>> message = steganan.retrieve_string_from_payloads(a)\n>>> print(message)\nI have a secret!\n```\n\n### Notebook example\n\nSee [lightning talk slides](https://github.com/kjordahl/steganan/blob/main/slides/talk.ipynb).\n\n---\n\nRepository initiated with [fpgmaas/cookiecutter-uv](https://github.com/fpgmaas/cookiecutter-uv).\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Steganography in floating point data with NaN payloads",
    "version": "0.2.0",
    "project_urls": {
        "Homepage": "https://github.com/kjordahl/steganan",
        "Repository": "https://github.com/kjordahl/steganan"
    },
    "split_keywords": [
        "python"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "10c7aa108f5059f70ae65e7f7b3d49a1504f030aba53f163a9bab35c0eba1457",
                "md5": "0c0aad604adc25ccd7154e7d265903e8",
                "sha256": "7fe5dc33928b981fc16ea204d57153209be28e5adfe344f31f1cb25d151f504d"
            },
            "downloads": -1,
            "filename": "steganan-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "0c0aad604adc25ccd7154e7d265903e8",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 5371,
            "upload_time": "2025-07-15T03:47:29",
            "upload_time_iso_8601": "2025-07-15T03:47:29.380589Z",
            "url": "https://files.pythonhosted.org/packages/10/c7/aa108f5059f70ae65e7f7b3d49a1504f030aba53f163a9bab35c0eba1457/steganan-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "50fd4aaf8a8006ffd93627b9af986b43d09a4a4c5e1a07aab833a82aacac7fa0",
                "md5": "7c724e8daf303137bb10de5cdcf32dc5",
                "sha256": "a618fc10770c9e88bed9040a9f7cfbadb58e2ebd4ca36723d393ab79890dc1b3"
            },
            "downloads": -1,
            "filename": "steganan-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "7c724e8daf303137bb10de5cdcf32dc5",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 1103569,
            "upload_time": "2025-07-15T03:47:31",
            "upload_time_iso_8601": "2025-07-15T03:47:31.045910Z",
            "url": "https://files.pythonhosted.org/packages/50/fd/4aaf8a8006ffd93627b9af986b43d09a4a4c5e1a07aab833a82aacac7fa0/steganan-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-15 03:47:31",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "kjordahl",
    "github_project": "steganan",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "steganan"
}
        
Elapsed time: 0.95198s