Watermarking claims are rarely comparable. This page publishes how we measured energy, robustness and false attribution for FORTRESS and for TrustMark (Adobe, open source, neural), the raw files, and an invitation to re-run it or add your own tool. We say where we do not win.Wasserzeichen-Aussagen sind selten vergleichbar. Diese Seite zeigt, wie wir Energie, Robustheit und Falschzuordnung für FORTRESS und für TrustMark (Adobe, Open Source, neuronal) gemessen haben, die Rohdateien und die Einladung, nachzumessen oder ein eigenes Werkzeug aufzunehmen. Wir sagen, wo wir nicht gewinnen.
1024×1024 crops of 12 real camera photos. Each row: 3 runs of 40 s, an idle baseline before every run, median shown. Energy is read from the CPU power counter of Windows (RAPL-style) and the idle power is subtracted.1024×1024-Ausschnitte von 12 echten Kamerafotos. Jede Zeile: 3 Läufe à 40 s, vor jedem Lauf eine Leerlauf-Messung, der Median wird gezeigt. Die Energie kommt vom CPU-Leistungszähler von Windows (RAPL-artig), die Leerlaufleistung ist abgezogen.
| OperationVorgang | time per op (as shipped)Zeit je Vorgang (wie ausgeliefert) | CPU-seconds per op, as shippedCPU-Sekunden je Vorgang, wie ausgeliefert | CPU-seconds, ONE threadCPU-Sekunden, EIN Thread | energy per op, mJEnergie je Vorgang, mJ |
|---|---|---|---|---|
| TrustMark encode | 147 ms | 2.06 | 0.440 | 768 (measured; range 385–1154)768 (gemessen; Spanne 385–1154) |
| TrustMark decode | 56 ms | 0.81 | 0.164 | 627 (measured)627 (gemessen) |
| FORTRESS invisible: embedFORTRESS invisible: einbetten | 49.1 ms | 0.060 | 0.060 | ≈ 22–47 (estimate: below meter noise)≈ 22–47 (Schätzung: unter dem Rauschen des Zählers) |
| FORTRESS invisible: readFORTRESS invisible: lesen | 25.0 ms | 0.029 | 0.029 | ≈ 11–23 (estimate: below meter noise)≈ 11–23 (Schätzung: unter dem Rauschen des Zählers) |
| FORTRESS fragile: sealFORTRESS fragil: siegeln | 10.7 ms | 0.014 | 0.014 | ≈ 5–11 (estimate: below meter noise)≈ 5–11 (Schätzung: unter dem Rauschen des Zählers) |
| FORTRESS fragile: verifyFORTRESS fragil: prüfen | 2.1 ms | 0.002 | 0.002 | ≈ 1–2 (estimate: below meter noise)≈ 1–2 (Schätzung: unter dem Rauschen des Zählers) |
Reading it honestly. Single-threaded, FORTRESS needs about 7× fewer CPU-seconds to embed and 6× fewer to read (measured). As shipped, TrustMark spreads the work over 16 threads, which costs extra CPU time; there the gap is about 28–34× (decode–encode). Energy: the meter resolves TrustMark clearly (about +6 to +11 W over idle) but a single FORTRESS thread (about +1 to +2 W) sits inside its noise (idle drifts by 5 W), so the FORTRESS joules are an estimate: CPU-seconds × the joules per CPU-second observed for TrustMark (0.37–0.78 J). The energy gap therefore lies between roughly 4× (single-thread) and 35× (as shipped). We did not measure a GPU, a different CPU or a wall-socket meter.Ehrlich gelesen. Mit einem Thread braucht FORTRESS etwa 7× weniger CPU-Sekunden zum Einbetten und 6× weniger zum Lesen (gemessen). TrustMark verteilt die Arbeit wie ausgeliefert auf 16 Threads, das kostet zusätzliche CPU-Zeit; dort liegt der Abstand bei etwa 28–34× (Lesen–Einbetten). Energie: Der Zähler löst TrustMark klar auf (etwa +6 bis +11 W über Leerlauf), aber ein einzelner FORTRESS-Thread (etwa +1 bis +2 W) liegt im Rauschen (der Leerlauf driftet um 5 W), die FORTRESS-Joule sind deshalb eine Schätzung: CPU-Sekunden × die bei TrustMark beobachteten Joule je CPU-Sekunde (0,37–0,78 J). Der Energieabstand liegt damit zwischen grob 4× (ein Thread) und 35× (wie ausgeliefert). Wir haben keine GPU, keine andere CPU und kein Steckdosen-Messgerät gemessen.
Same 12 photos. Count of photos where the original payload was read back correctly after the attack. The unmarked control must read nothing.Dieselben 12 Fotos. Anzahl der Fotos, bei denen die ursprüngliche Nutzlast nach dem Angriff korrekt gelesen wurde. Die unmarkierte Kontrolle darf nichts lesen.
| AttackAngriff | FORTRESS invisible | TrustMark Q |
|---|---|---|
| no attackkein Angriff | 12/12 | 12/12 |
| JPEG q90JPEG q90 | 12/12 | 12/12 |
| JPEG q75JPEG q75 | 12/12 | 12/12 |
| JPEG q50JPEG q50 | 12/12 | 12/12 |
| resize to 75 %Verkleinern auf 75 % | 12/12 | 12/12 |
| centre crop 10 %, rescaledMittelzuschnitt 10 %, hochskaliert | 12/12 | 12/12 |
| false hits on unmarked photosFehltreffer bei unmarkierten Fotos | 0/12 | 0/12 |
| pixel distortion, median PSNR (higher = less change; not visibility)Pixelverzerrung, Median-PSNR (höher = weniger Änderung; nicht Sichtbarkeit) | 39.2 dB | 42.6 dB |
Where we do not win or are not comparable. TrustMark changes the pixels less (higher PSNR; PSNR is not visibility, the colour-difference test is in round 2 below). The invisible profile held all six attacks here, although it is documented as not crop-resistant (our crop test rescales back to the original size, which is the easy case). Payloads differ (a 128-bit key versus a short BCH-coded text). The attacks are mild: no rotation, no AI redraw, no screenshot-of-a-screen. n = 12. The fragile seal has no TrustMark counterpart and is not in this table.Wo wir nicht gewinnen oder nicht vergleichbar sind. TrustMark verändert die Pixel weniger (höheres PSNR; PSNR ist keine Sichtbarkeit, und den Farbdifferenz-Test haben wir an TrustMark nicht gefahren). Das unsichtbare Profil hielt hier alle sechs Angriffe, obwohl es als nicht zuschnittfest dokumentiert ist (unser Zuschnitt wird auf die Originalgröße zurückskaliert, das ist der leichte Fall). Die Nutzlasten unterscheiden sich (ein 128-Bit-Schlüssel gegen einen kurzen BCH-codierten Text). Die Angriffe sind mild: keine Drehung, keine KI-Neuzeichnung, kein Foto eines Bildschirms. n = 12. Das fragile Siegel hat bei TrustMark keine Entsprechung und steht nicht in dieser Tabelle.
Same 12 photos, same machine, run on 2026-10-21 11:13. Visibility is measured as CIEDE2000 colour difference (ΔE00) on the worst 64×64 window, not as a PSNR average; the threshold is 1.0.Dieselben 12 Fotos, dieselbe Maschine, gemessen am 2026-10-21 11:13. Sichtbarkeit wird als CIEDE2000-Farbabstand (ΔE00) im schlimmsten 64×64-Fenster gemessen, nicht als PSNR-Mittel; die Schwelle ist 1,0.
| FORTRESS invisible | TrustMark | |
|---|---|---|
| worst 64×64 window, median over 12 photos (≤ 1.0 = not visible)schlimmstes 64×64-Fenster, Median über 12 Fotos (≤ 1,0 = nicht sichtbar) | 0.76 | 1.86 |
| worst window, smoothest quarter of the photoschlimmstes Fenster, glatteste Bildviertel | 0.75 | 1.07 |
| share of pixels above 1.0, median %Anteil Pixel über 1,0, Median % | 42 % | 11 % |
Attacks that round 1 did not have. Photos with the payload read back correctly, out of 12.Angriffe, die Runde 1 nicht hatte. Fotos mit korrekt gelesener Nutzlast, von 12.
| FORTRESS invisible | TrustMark | |
|---|---|---|
| no attackkein Angriff | 12/12 | 12/12 |
| rotate 2° (corners cut)Drehung 2° (Ecken weg) | 0/12 | 12/12 |
| rotate 5°Drehung 5° | 0/12 | 0/12 |
| crop 10 %, NOT rescaledZuschnitt 10 %, NICHT hochskaliert | 12/12 | 12/12 |
| resize 75 % then JPEG 60Verkleinern 75 % dann JPEG 60 | 12/12 | 12/12 |
| resize 50 %Verkleinern 50 % | 12/12 | 12/12 |
| blur σ 1.5Weichzeichnen σ 1,5 | 12/12 | 12/12 |
| noise σ 6Rauschen σ 6 | 12/12 | 12/12 |
| false hits on unmarked photos (worst attack)falsche Treffer auf unmarkierten Fotos (schlimmster Angriff) | 0/12 | 0/12 |
Reading it honestly. By window colour difference our invisible profile is below the threshold and TrustMark is above it; by share of changed pixels TrustMark touches fewer. We measure only the invisible profile: anything visible is not part of the product we compare. A 2° rotation: TrustMark reads 12/12, our shipped reader 0/12 (blind rotation exists in our lab, not in the shipped SDK). At 5° neither reads. Still one machine, 12 photos, our own harness; no independent re-run yet. Raw file: runde2.json.Ehrlich gelesen. Im Fenster-Farbabstand liegt unser unsichtbares Profil unter der Schwelle und TrustMark darüber; beim Anteil veränderter Pixel verändert TrustMark weniger. Wir messen nur das unsichtbare Profil: alles Sichtbare gehört nicht zu dem Produkt, das wir vergleichen. Drehung um 2°: TrustMark liest 12/12, unser ausgelieferter Leser 0/12 (blinde Drehung gibt es bei uns im Labor, nicht im ausgelieferten SDK). Bei 5° liest keiner. Weiterhin eine Maschine, 12 Fotos, unser eigener Messaufbau; noch kein unabhängiger Nachlauf. Rohdatei: runde2.json.
If you build image or video watermarking, provenance or tamper-evidence, bring your tool: write an adapter (a few lines, see the repository) and run the harness. The rules are short.Wenn Sie Wasserzeichen, Herkunftsnachweise oder Manipulationserkennung für Bild oder Video bauen: bringen Sie Ihr Werkzeug mit. Die Regeln sind kurz.
Source: Fortress benchmark harness, runs dated on this page; full record in BENCHMARK_TRUTH (Fortress repo).