Files
ZWUS-rs/README.md

2.1 KiB

Zero Width Unicode Standard (ZWUS)

Zero Width Unicode Steganography — hide text inside invisible characters.

[dependencies]
zwus = "0.2"

Usage

use zwus::Zwus;

// Encode & decode strings
let hidden = Zwus::encode_string("secret");
let revealed = Zwus::decode_to_string(&hidden);
assert_eq!(revealed, "secret");

// Encode & decode number arrays
let encoded = Zwus::encode_number_array(&[72, 101, 108]);
let decoded = Zwus::decode_to_number_array(&encoded);
assert_eq!(decoded, vec![72, 101, 108]);

Base

Higher base = shorter output, but more likely visible in some renderers.

use zwus::Zwus;

Zwus::encode_string_with_base("hi", 3); // safest
Zwus::encode_string_with_base("hi", 6); // default, compact
Zwus::encode_string_with_base("hi", 8); // most compact

Decode must match the encode base:

use zwus::Zwus;

let encoded = Zwus::encode_string_with_base("hi", 6);
Zwus::decode_to_string_with_base(&encoded, 6);

Embedded in visible text

Non-ZWUS characters are automatically ignored during decoding, so hidden payloads survive being mixed into normal text.

use zwus::Zwus;

let hidden = Zwus::encode_string("secret");
let carrier = format!("nothing to see here{hidden}, move along");
let extracted = Zwus::decode_to_string(&carrier);
assert_eq!(extracted, "secret");

Full Unicode support

Handles emoji and all of Unicode — anything char can represent.

use zwus::Zwus;

let encoded = Zwus::encode_string("hello 🦀🔥");
let decoded = Zwus::decode_to_string(&encoded);
assert_eq!(decoded, "hello 🦀🔥");

Interop

Encoded output is byte-identical to the npm package, so you can encode in JS and decode in Rust or vice versa.

License

WTFPL

Browser Extension

You can also use ZWUS in your browser with inØsight: Firefox Add-on · Chrome Web Store