Skip to content

Repository files navigation

Underlay

Underlay is a local .NET desktop app for hiding encrypted text messages inside ordinary PNG images.

The goal is not just to encrypt message content, but to avoid obvious technical markers that reveal a message exists. Underlay encrypts text with AES-256-GCM using an Argon2id-derived key, then embeds the encrypted payload into adaptive PNG pixel data. There are no accounts, servers, telemetry, analytics, or network workflows.

Status

Current release: 0.1.0-beta

Supported v1 beta workflow:

  • Select a PNG cover image.
  • Enter a text message and password.
  • Save an encoded PNG.
  • Reveal the message later from the encoded PNG with the same password.

Important v1 limitations:

  • PNG only for the user-facing workflow.
  • JPEG support is experimental research only.
  • Resizing, cropping, screenshots, format conversion, and social-platform processing are expected to destroy hidden content.
  • Large 12MP-class PNGs can take tens of seconds to encode or decode.
  • Advanced targeted steganalysis is out of scope.
  • Password exchange is out of scope.
  • Do not share the original cover image together with the encoded output image.

Build And Run

Requirements:

  • .NET 8 SDK for building and testing.
  • .NET 8 Desktop Runtime for running the framework-dependent Windows beta package.

From the repository root:

dotnet restore Underlay.sln
dotnet build Underlay.sln --configuration Release --no-restore
dotnet run --project src\Underlay.App\Underlay.App.csproj --configuration Release

Run the test suite:

dotnet test Underlay.sln --configuration Release --no-build

Create the Windows x64 beta publish folder:

dotnet publish src\Underlay.App\Underlay.App.csproj --configuration Release --runtime win-x64 --self-contained false --output artifacts\publish\underlay-v1-beta-win-x64

Run the packaged app:

.\artifacts\publish\underlay-v1-beta-win-x64\Underlay.exe

Documentation

Security Model Summary

Underlay's encrypted payload format is exactly:

[salt:16][nonce:12][ciphertext:N][authTag:16]

There are no magic bytes, version fields, fixed app identifiers, or Underlay signatures in the encrypted payload. Decode failures are intentionally uniform:

No message found

The same message is shown for a wrong password, a clean image, corrupted payload, unsupported data, or extraction failure. This avoids leaking whether hidden data exists.

License

Underlay is released under the MIT License.

About

Local PNG steganography app for hiding encrypted messages in plain sight

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages