ROT13 是一種文字轉換,它會將每個 ASCII 大寫字母 A–Z 和小寫字母 a–z 在字母表中向前移動恰好 13 個位置,把 Z 繞回 A、z 繞回 a,同時讓字串中所有其他字元保持原樣不變。由於拉丁字母表包含 26 個字母,移動 13 個位置格外特別:這個操作是自身的反函數,這代表對明文字串套用一次 ROT13 就會將其編碼,再對輸出套用一次就會解碼回原始文字。這個轉換只會碰觸兩個 ASCII 字母集合,所以大寫字母保持大寫、小寫字母保持小寫,而數字、標點符號、空格、換行符、重音拉丁字元、希臘文、西里爾文、阿拉伯文、CJK 字元以及表情符號則全部原封不動地通過。例如,Hello 這個字會變成 Uryyb,而對 Uryyb 再套用 ROT13 就會還原為 Hello。這種可預測性,加上對所有人來說對應規則都相同,正是 ROT13 之所以適合用於非正式的可逆混淆處理(例如在論壇中隱藏劇透),也正是它並非加密的原因。

用淺顯英文說明 ROT13
想像把英文字母表的 26 個字母寫在一張紙條上,一端是 A,另一端是 Z。ROT13 會把這條紙條對半精準地對折,然後讓每個字母與正對面的字母對調。所以 A 對上 N、B 對上 O、C 對上 P,依此類推,直到 M 對上 Z。這一次對折就是整個密碼的全部。沒有祕密金鑰、沒有位移旋鈕,也沒有每則訊息不同的設定。位移固定為 13,因為將 26 個字母旋轉 13 個位置兩次,會讓每個被對應的字母回到原來的位置。
初學者有時會把 ROT13 與加密混淆。它並非加密。加密的前提是讀者在沒有所握金鑰的情況下無法反轉轉換。ROT13 的前提恰好相反:對應規則是公開的,反向操作就是你剛才按下的同一顆按鈕,任何認得字母表的人都可以在腦中解碼你的訊息。這就是為什麼經營已久的網路社群,從 Usenet 討論群到現代論壇,都用它來模糊劇透或謎題提示,而不是用來保守祕密。
逐字母對應表
一旦把對應表寫出來,整個轉換就一目了然。字母表前半段對應到後半段,後半段再對應回前半段。
| 原文 (A–M) | ROT13 (N–Z) | 原文 (N–Z) | ROT13 (A–M) |
|---|---|---|---|
| A | N | N | A |
| B | O | O | B |
| C | P | P | C |
| D | Q | Q | D |
| E | R | R | E |
| F | S | S | F |
| G | T | T | G |
| H | U | U | H |
| I | V | V | I |
| J | W | W | J |
| K | X | X | K |
| L | Y | Y | L |
| M | Z | Z | M |
小寫字母的對應方式相同,a 變成 n、n 變成 a、m 變成 z、z 變成 m。由於每一列對調的是相隔 13 個位置的兩個字母,因此每個 ASCII 字母必定會變成另一個不同的 ASCII 字母,所以「被對應的字母」計數永遠等於輸入中實際改變值的字元數量。
如何使用瀏覽器工具套用 ROT13
對初學者來說,解碼或編碼一段文字最快速的方法,就是把文字貼到一個以瀏覽器為基礎的 ROT13 解碼器中,按下一顆按鈕即可。ROT13 編碼解碼器 完全在你目前的分頁中執行轉換,所以你的文字從不離開瀏覽器。基本操作流程分為三個步驟。
- 把你的文字貼到輸入區。它可以包含 ASCII 字母、數字、標點符號、空格、重音字元、表情符號與 CJK 字元的任意組合;只有 ASCII 的 A–Z 與 a–z 字母會被移動。
- 選擇「套用 ROT13」。工具會掃描每個碼元,將每個 ASCII 字母轉換 13 個位置,完整保留所有其他碼元,然後顯示新字串以及被對應的 ASCII 字母數量。
- 如有需要,可將輸出複製到剪貼簿,或對該輸出再套用一次 ROT13 以還原原始文字。由於操作是自身的反函數,解碼與編碼是同一個點擊動作。
編輯輸入會清除先前的輸出、任何驗證訊息、字母計數與複製狀態,因此你隨時看到的結果都與輸入框中目前的文字一致。如果輸入為空,工具會回報錯誤;如果超過一百萬個 UTF-16 碼元,則會在執行前以明確訊息拒絕轉換,因此不會有任何內容被悄悄截斷。
為什麼同一顆按鈕既能編碼也能解碼
初學者常會預期有獨立的「編碼」與「解碼」按鈕。ROT13 並不需要。任選一個 ASCII 字母,向前推進 13 個位置,再向前推進 13 個位置:你會回到原來的字母。這對每個 A 到 Z、以及每個 a 到 z 都成立,因為 13 加上 13 等於 26,正好是每個字母表的完整長度。因此如果把 ROT13 轉換的輸出再送回同一個函式,結果會與原始輸入逐字元完全相同。
你可以從 café 這個範例直接看到這一點。字母 c、a、f 都是 ASCII,所以工具把 c 對應到 p、a 對應到 n、f 對應到 s。é 不是 ASCII 字母,因此保持不動,得到 pnsé。對 pnsé 再套用 ROT13,ASCII 字母 p、n、s 就會對應回 c、a、f,而 é 則原封不動。原始的 café 會完整還原,包括重音記號。
哪些內容保持不變
由於工具只旋轉兩個 ASCII 字母集合,字串中所有其他碼元都會逐字保留,包括 0 到 9 等數字、逗號與問號等標點符號、空格、定位字元與換行符、被當作普通資料處理的 NUL 位元組、像 é 或 ü 這類重音拉丁字母、希臘文、西里爾文、阿拉伯文與 CJK 字元,以及像代理對組成的表情符號這類字符。以字母 e 接著 U+0301(組合式銳音符號)這樣的組合序列為例,只有 ASCII 的 e 會被改變,組合記號則留在原處。這種嚴格的行為與官方 Python ROT13 轉換表一致,也避免假裝 ROT13 為各種書寫系統定義了旋轉規則。
輸出長度永遠等於輸入長度,以 UTF-16 碼元計算,因為每個被轉換的 ASCII 碼元恰好被另一個 ASCII 碼元取代,其他碼元則原樣保留。輸出旁顯示的「已變更字母」計數只計算被對應的 ASCII 字母,因此絕對不會因未變動的數字、標點或 Unicode 字元而虛增。
初學者常見的限制與邊緣情況
在貼上長文件之前,有幾個實際的界線值得了解。輸入上限為一百萬個 UTF-16 碼元;剛好等於上限的文字會被完整接受並轉換,而超過上限一個碼元的內容則會在轉換前以明確訊息拒絕,因此不會被切片、取樣、縮短或悄悄設上限。空輸入會被視為錯誤;至於不含任何 ASCII 字母的非空內容(例如完全由數字或表情符號組成的字串)則屬於有效的轉換,計數為零。
如果瀏覽器拒絕剪貼簿存取,唯讀輸出仍可手動選取。工具採用任務產生與計時器身分識別保護機制,因此較舊的非同步剪貼簿完成事件無法發布過時狀態,也無法清除較新的確認結果;編輯輸入或執行新的轉換會讓任何擱置中的完成事件失效。這些機制不會影響解碼正確性,只會影響複製按鈕回報成功的方式。
ROT13 並非加密
這份指南最值得初學者記住的一件事是:ROT13 屬於可還原的混淆處理,並非安全性機制。它沒有金鑰,每次轉換都使用同一套公開的對應規則,任何認得 ROT13 的人只要再套用一次 ROT13 就能立即還原。它不應該用來保護密碼、API 權杖、個人資訊、私密訊息、正式環境設定值或任何祕密。
在網路歷史上,記載於像 RFC 1855《網路禮儀指南》等資料中的用途包括模糊化劇透或讀者可能不願意外瞥見的內容。這就是 ROT13 至今仍有益處的精神所在:它讓隨意瀏覽的讀者有片刻機會移開目光,而好奇心重的讀者則能即時解碼。當你需要可調整位移的 ASCII 移位時,請使用凱撒密碼工具;當你需要真正的機密性、身分驗證或完整性保護時,請使用經過稽核、成熟的密碼學系統。