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.
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.
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 ReleaseRun the test suite:
dotnet test Underlay.sln --configuration Release --no-buildCreate 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-x64Run the packaged app:
.\artifacts\publish\underlay-v1-beta-win-x64\Underlay.exe- User guide
- Threat model
- Technical whitepaper
- Privacy statement
- Release notes
- Changelog
- Security policy
- Contributing guide
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.
Underlay is released under the MIT License.