跳到主要内容

ROT47 编码:连数字和符号一起搬走的字母轮盘

ROT47 把可见 ASCII 33 到 126 这九十四个字符整体循环位移 47 位,数字和标点也会变。本文讲清它和 ROT13 的区别、自反性原理,以及论坛遮挡剧透和 CTF 解谜的实际用法,顺带提醒它不是加密。

发布于 作者 李雷
#rot47 #编码 #ascii #密码 #ctf

ROT47 编码:连数字和符号一起搬走的字母轮盘

很多人第一次见 ROT47,会以为它只是 ROT13 换了个数字。其实差别不小。ROT13 只动二十六个拉丁字母,数字、网址、标点都原样露在外面;ROT47 把整块可见 ASCII 都拉进来一起转。如果你想让一段文本看上去面目全非,又能用同一个操作还原回去,ROT47 比 ROT13 更彻底。

它到底搬动了哪些字符

ROT47 处理的是可打印 ASCII,也就是码点 33 到 126 这一段。从叹号 ! 一直排到波浪号 ~,正好是九十四个字符,字母、数字、括号、斜杠、各种标点全在里面。ROT47 把这九十四个字符想象成一个首尾相接的环,每个字符往后挪 47 位,挪过末尾就绕回开头。

落在这个范围之外的东西它一概不碰。空格码点是 32,在 33 之前,所以空格保持不变;制表符、换行也一样原样穿过;中文字符、西里尔文、emoji 这些非 ASCII 文本同样不动。这一点很实用,意味着你粘一段带换行和缩进的代码进去,排版不会乱,只有那九十四个可见字符被搬走了。

和 ROT13 的关键区别:数字也变

ROT13 留着数字可读,这在很多场景下不是优点而是漏洞。举个例子,字符串 Order 42,用 ROT13 处理,42 一动不动,只有 Order 这个词换了样子;用 ROT47 处理,词和数字一起被重写。

当你要遮挡的内容里含数字或符号,比如一个集数、一个比分、一段网址、一个哈希值或者订单 ID,ROT13 就漏了。https:// 里的冒号和斜杠在 ROT13 下纹丝不动,链接结构一眼可辨;在 ROT47 下,连这些符号都被打乱,整条网址变成符号乱码,不点工具还原就看不出原貌。想感受这种差别,可以把同一段文本分别丢进 /zh/t/rot13-encoder//zh/t/rot47-encoder/ 对照一下输出。

为什么编码和解码是同一个操作

ROT47 最优雅的地方在于自反性。它处理的字符集恰好九十四个,位移 47 会把每个字符送到这个九十四宽的环的对侧。再位移 47,就走满一整圈 94,每个字符回到原来的位置,因为 47 加 47 正好等于 94。

所以这个工具只需要一个按钮,不分编码模式和解码模式。同样的逻辑解释了 ROT13 为什么取 13:那是二十六个字母表的一半。规律很干净,取字母表的一半做位移,运算就一定是自反的。

一个看得见的例子:Hello 怎么变

我自己第一次真正信服这套机制,是一个字符一个字符手算了一遍 HelloH 码点 72,加 47 得 119,对应字母 w;e 码点 101,加 47 越过 126 绕回,落在数字 6 上;两个 l 码点 108,各映射成等号 =;o 码点 111,映射成 at 符号 @。于是 Hello 变成 w6==@

再对 w6==@ 跑一次 ROT47,就直接拿回 Hello。你能看到一个英文单词输出里冒出数字和符号,这恰恰是 ROT47 比 ROT13 更彻底的直观证据。课堂上讲替换密码和模运算,这是个很顺手的例子:学生输入自己的名字,看每个字符都挪位,再做一次就看原文回来,绕回的概念一下就具体了。

它能做什么,不能做什么

ROT47 在论坛里遮挡剧透很合适。它延续了 Usenet 上打乱剧透的老习惯,读者得主动把文本丢回工具才看得到内容,而且连剧透里的集数和比分也一起藏住。CTF 和密室逃脱类谜题里它也是常客,因为它动的是整套可打印 ASCII,当一个 flag 看起来是带一堆符号的旋转乱码而不只是位移过的字母,答案往往就是它。

但有一条底线要记牢:ROT47 不是加密,是混淆。它没有密钥,映射固定又公开,任何人一行代码就能还原。需要真正保密时,请用 AES-GCM 或者 age,别拿 ROT47 当锁。如果你想要带密钥的古典替换,可以看 /zh/t/vigenere-cipher/,那才是有钥匙的那一类。

ROT47 不解决保密问题,它解决的是"我想让这段文字默认不可读、但任何人都能轻松还原"这件事。把这条边界划清楚,你就不会用错。


Made by Toolora · Updated 2026-06-13