Median of 11 iterations after 3 warmups, wall-clock via std::process::Command, on macOS aarch64 (Apple Silicon, 28 cores). Methodology and full per-case tables in bench/README.md.
| Op / carrier / payload | rsteg | steghide | stegano | speedup (vs next best) |
|---|---|---|---|---|
| BMP 128×128 embed 1 KB | 1.6 ms | 20.6 ms | — | 13× |
| BMP 128×128 extract 1 KB | 1.5 ms | 6.5 ms | — | 4.4× |
| BMP 512×512 embed 1 KB | 3.8 ms | 41.2 ms | — | 11× |
| BMP 512×512 embed 10 KB | 3.5 ms | 440.1 ms | — | 125× |
| BMP 512×512 extract 10 KB | 2.7 ms | 28.1 ms | — | 10× |
| WAV 5 s stereo embed 1 KB | 2.4 ms | crash¹ | 69 ms | 29× (vs stegano) |
| WAV 5 s stereo embed 20 KB | 3.5 ms | crash¹ | 71 ms | 20× (vs stegano) |
| WAV 5 s stereo extract 20 KB | 2.9 ms | crash¹ | 68 ms | 23× (vs stegano) |
| PNG 256×256 embed 1 KB | 6.1 ms | — | 67 ms | 11× |
| PNG 256×256 extract 10 KB | 2.6 ms | — | 66 ms | 25× |
¹ Native arm64 steghide 0.6.0 reliably SIGSEGVs when embedding payloads
≥ 1 KB into the synthetic wav-short cover. Raising ulimit -s to 64 MB
did not help, so this is not a stack-size issue. Payloads ≤ 512 B embed
successfully. rsteg is the only tool with complete wav-short coverage
on this platform.
rsteg is faster than both reference tools on every case it shares with them.
The gap versus steghide is 4–125× depending on carrier size and
payload; against stegano-cli on PNG/WAV it's 10–25×.
| Tool | Version | Build |
|---|---|---|
| rsteg | 0.1.0 | this repo — cargo build --release |
| steghide | 0.6.0 | built from source, native arm64 (autotools + Homebrew libs) |
| stegano | 0.6.1 | cargo install stegano-cli |
Homebrew dropped the steghide package in 2024, and upstream ships no arm64 binary, so the comparison baseline is a native arm64 build of steghide 0.6.0 (build steps in the full report).
fork/exec, dynamic linker, and CRT init — i.e. what an interactive user actually experiences.png-photo-* cases); miniz_oxide is ~2–3× faster on natural imagery than on noise.embed-encrypted sub-run measures Argon2id + XChaCha20-Poly1305 overhead separately: ~3–4 ms of AEAD on top for ≤ 100 KB payloads; Argon2id dominates when --password is set (memory-hard KDF, intentionally).steghide is 4–125× depending on carrier size and payload; against stegano-cli on PNG/WAV it's 10–25×.