日期:2026-08-29 · 版本:v1 · 环境:Node v22.14.0 + Chromium 151 (Playwright)
node tests/codec.test.js
| 类别 | 用例 | 结果 |
|---|---|---|
| emoji 表 | 256 个唯一单码位 emoji;与公开区间规则一致 | PASS |
| CRC32 | 标准向量 "123456789" → 0xCBF43926 |
PASS |
| Reed-Solomon | 无错往返;1/4/8/16 字节错误全部纠正;多块含错往返;20 字节错误明确报错(不静默错解码) | PASS |
| 帧 | 明文/压缩/加密往返;错误密码拒绝;缺密码标记;CRC 抓篡改 | PASS |
| 隐形层往返 | 消息长度 0 / 1 / 6 / 17 / 100 / 5000 字(中英 emoji 混合)全部恒等 | PASS |
| VS16 冲突 | 文本以 ❤️🔥⭐ 结尾仍正确解码;纯 emoji 文本零误报 | PASS |
| 抗损坏 | 随机翻转 3% 隐形字符 → RS 纠错后完整解码 | PASS |
| 删除损坏 | 删除 10 个隐形字符 → 响亮报错,绝不输出错误消息 | PASS |
| 分段嵌入 | 5 段文本仅剩末段副本仍解码;每个段落都带独立副本;副本数封顶 MAX_REPLICAS = 20 |
PASS |
| 相邻帧 | 多份副本被合并成一个 VS 连续段时,逐位偏移扫描能全部找到 | PASS |
| 加密流 | 加密水印自动关闭 emoji 层;无密码提示输入;错误密码拒绝 | PASS |
| emoji 层 | 中英/emoji 消息往返;篡改 1 个 emoji → 校验拒绝;纯文本零误报 | PASS |
| 清除(strip) | 双层全部移除后与原文逐字一致;保留 ❤️ 等真实变体选择符与普通 emoji;加密水印无需密码也能清除 | PASS |
| 端到端 | 双层同消息一致解码;10KB 消息往返 | PASS |
python tests/e2e_browser.py
- 加水印页:emoji 签名条开关默认关闭 → 输出中不含 📜,只有隐形层;点击输入框后圆角不变(焦点效果沿用字段自身圆角)
- 打开 emoji 开关后重新生成:输出可见文本与原文逐字一致;统计
隐形字符 +89 · emoji +51 · 帧 57 字节(与理论值吻合:57+32=89;📜+2+2+45+1=51);自检 chip 显示"自检通过:可解码" - 分段模式:三段文本 →
findVSRuns()返回 3 段,即每段各带一份副本 - 检测页:粘贴输出 → 自动识别双层并正确显示消息
© 2026 张三 · 文档编号 A-17 · 机密 - 阴性对照:无水印原文 → 正确报告"未检测到水印"
- 清除页:带水印文本 → 清理结果与原文完全相等(逐字符比对)
- 规范页:256 格 emoji 表渲染完整;过滤
84后恰好 255 格变暗;AI 提示词模板存在 - 深浅色切换:
data-theme正确切到dark;中英切换正常;控制台与页面零报错 - 移动端(390×844,iPhone UA,
is_mobile):Tab 栏变为悬浮底部栏且完整落在视口内;无横向溢出(scrollWidth - clientWidth ≤ 1);.tab / .btn-primary / .icon-btn无一低于 40px 触控高度 - 截图:
tests/shots/1–9(含深色、英文、移动端与移动端规范页)
样本:📜🌄🌕😀😊🙁🙉😭🙏🙋😭😲😰😲😶🙈(消息 AI-OK-2026)
由 AI(Claude)仅凭公开规范手工解码,不执行任何解码代码:
- 🌄→U+1F304→序号 84→0x54='T';🌕→101→0x65='e'(EMAGIC 吻合)
- 😀😊→长度 N=10
- 🙁🙉😭🙏🙋😭😲😰😲😶 → 65,73,45,79,75,45,50,48,50,54 →
AI-OK-2026 - 🙈→72;消息字节和 584 mod 256 = 72 ✓ 校验通过
- 程序复核:解码结果与原始消息完全一致
结论:"把文本+公开提示词发给任意够强的 AI 即可读出水印"在符号级可行。注意:长消息(数百 emoji)手工解码对 AI 容易出错,建议 AI 可读层用于 ≤140 字节的短消息;长消息走隐形层+网站检测。
| 场景 | 隐形层 | emoji 层 |
|---|---|---|
| 浏览器/编辑器间复制粘贴 | 存活(已测) | 存活(已测) |
| 微信/备忘录/Google Docs 复制 | 预期存活(保留 Unicode) | 预期存活 |
| Markdown 渲染后复制 | 预期存活 | 存活 |
| 短信/ aggressive 清洗管道 | 可能被剥离 | 存活 |
| 轻度编辑(改几个字) | 分段模式下幸存段落可解码 | 视编辑位置 |
| AI 改写/翻译/重排 | 破坏 | 破坏 |
- RS 纠错覆盖随机字节错误;删除/插入隐形字符会导致该副本不可解码(响亮报错,不会错解码)——分段嵌入模式可缓解。
- 帧头损坏超过 RS 纠错能力时无法定位帧尾 → 解码失败(不静默)。
- emoji 层无加密/无纠错(为 AI 手工解码刻意简化),由 SUM8 提供完整性校验。
- 加密水印与 AI 公开可读互斥(设密码时 emoji 层自动关闭)。
- 规范完全公开 ⇒ 任何人都能一键清除水印(本站「清除水印」页即可)。TextMark 提供的是归属证明与泄露追踪,不是防篡改/DRM。