莎士比亚名句-凯撒密码加密器
加密时可插入莎士比亚语句;解密仅移除零宽哨兵包裹的插入段。凯撒移位仅作用于英文 A-Z/a-z。
如若想看莎士比亚名句的插入情况 请取消勾选:插入语句也做凯撒移位
----------------------------------------------------------------------------------------
注
所谓“零宽哨兵包裹”,就是用一对不可见的零宽字符序列作为起止标记,把你插入的句子“夹在中间”。这样:
-
加密时把插入段包裹起来,用户肉眼看不到标记;
-
解密时用这对标记把插入段整体识别并移除,不影响主文本的反向移位。
核心点如下:
-
零宽字符是什么
-
U+200B Zero Width Space(零宽空格)
-
U+200D Zero Width Joiner(零宽连字)
-
U+2063 Invisible Separator(不可见分隔符)
-
它们是 Unicode 中的“格式化字符”,不占宽度、不显示字形,常见的有:
-
在英文文本里加入这些字符,通常不会改变显示效果,但它们依然是“字符”,可以被代码匹配到。
-
具体做法
-
形如:new RegExp(escape(S_START) + "[\s\S]*?" + escape(S_END), "g")
-
使用 [\s\S] 而不是 .,是为了跨行匹配;用 *? 非贪婪,避免从第一个起始标记吃到最后一个结束标记。
-
S_START = U+200B U+2063 U+200D
-
S_END = U+200D U+2063 U+200B
-
定义起始和结束哨兵,示例(与你的代码一致):
-
插入时:在选定位置插入 S_START + 插入句子 + S_END。
-
解密时:用一个非贪婪的正则,把 S_START 到 S_END 之间的所有内容整体删除:
-
选择三字符组合的原因
-
单一零宽字符在某些平台上偶尔会被自动清理或合并。
-
用三种不同的零宽字符、并且起止顺序相反,能显著降低“自然文本中误命中”的概率,也更不容易被偶然删除后仍残留成对。
-
-
具体做法
-
形如:new RegExp(escape(S_START) + "[\s\S]*?" + escape(S_END), "g")
-
使用 [\s\S] 而不是 .,是为了跨行匹配;用 *? 非贪婪,避免从第一个起始标记吃到最后一个结束标记。
-
S_START = U+200B U+2063 U+200D
-
S_END = U+200D U+2063 U+200B
-
定义起始和结束哨兵,示例(与你的代码一致):
-
插入时:在选定位置插入 S_START + 插入句子 + S_END。
-
解密时:用一个非贪婪的正则,把 S_START 到 S_END 之间的所有内容整体删除:
-
为什么不受凯撒移位影响
-
你的移位函数只处理 A-Z/a-z。哨兵是 Unicode 的格式化字符,不在字母范围内,所以不会被移位破坏。
-
解密时先移除哨兵包裹的插入段,再按“二次移位的相反顺序”对主文本反移位,互不干扰。
总之,零宽哨兵包裹是一种“隐形标注”的技术:标注插入段的位置与边界,同时不影响用户视觉体验;它不提供安全性(只是混淆),但足以让你的解密过程在不触碰主文本的前提下,准确移除插入的语句。
纯粹恶搞 不喜勿喷