ROT13 會將每個 ASCII 字母在字母表中向前移動 13 個位置,並在再次套用時反轉自身,因此同一個操作既可以編碼也可以解碼文字。對於一份快速的 ROT13 解碼器速查表,其規則是 A 變成 N、B 變成 O,依此類推到 M 變成 Z,然後 N 變成 A、O 變成 B、Z 變成 M,小寫字母則獨立遵循相同的 13 步模式。26 個字母的拉丁字母表會分成兩半各 13 個,因此每個 ASCII 字母恰好有一個對應字母,而列出這些對應字母就是完整的對應表。ROT13 僅作用於 ASCII 字母 A 到 Z 和 a 到 z,因此數字、標點符號、空格、定位鍵、換行符號、帶腔調的拉丁字母、CJK 字元以及表情符號都會原封不動地通過轉換。由於此轉換是自身的反函數,對結果再套用一次會逐位元組地還原原始字串,包括每一個保留的非 ASCII 字元。這個特性同時也是「該如何解碼 ROT13」的答案:只需對編碼後的文字再執行一次相同的 ROT13 操作即可。下方速查表彙整了字母對應表、非 ASCII 字元的規則,以及一個在本機端執行、不需上傳輸入內容的瀏覽器工作流程。

ROT13 字母對應表一覽
完整的 ROT13 速查表正好能放進一個 13 對的表格,因為每個 ASCII 字母會對應到前方 13 個位置的唯一一個夥伴,而該夥伴的夥伴就是原始字母。大寫與小寫獨立處理,因此 A 對應 N、a 對應 n,且大小寫絕不會互換。下表涵蓋了從 A 到 Z 的所有大寫輸入,足以透過直接查表來解碼任何標準的 ROT13 字串。
| 輸入 | ROT13 | 輸入 | ROT13 |
|---|---|---|---|
| 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 |
小寫字母使用相同的 13 對結構,只是大小寫降一階:a 對應 n、b 對應 o、m 對應 z、n 對應 a。這個對應表與官方 Python codecs 說明文件中所描述的 Python rot_13 轉換表相同,而 CPython rot_13 編解碼器原始碼也提供了直接的字母交叉驗證,因此上表與每個標準的 ROT13 實作所產生的結果一致。有了這份單頁參考資料,目視解碼 ROT13 就變成將每個 ASCII 字母替換為其在表中對應位置的夥伴,而字串其餘部分則保持不變。
ROT13 如何處理 ASCII 與其他字元
一個常見的陷阱是誤以為 ROT13 也會旋轉帶腔調的字母、數字或標點符號。它並不會。這個工具只旋轉兩個 ASCII 字母表,即 A 到 Z 與 a 到 z,並完整保留所有其他 UTF-16 程式碼單元。保留的群組包括數字 0 到 9、標點符號、空格、定位鍵、換行符號、被視為一般字串資料的 NUL 字元、符號、組合記號、帶腔調的拉丁字母、希臘文、斯拉夫文、阿拉伯文、CJK 字元以及表情符號。
CPython rot_13 編解碼器原始碼確認了這個狹窄的範圍:對應表僅以直接查表的方式實作於這兩個 ASCII 範圍,所有其他程式碼單元則原封不動地通過。這種嚴格的行為在混合字串中表現得特別清楚。例如,"café" 會變成 "pnsé",因為 c、a、f 是 ASCII 字母,而 é 不是。一個組合序列,例如字母 e 後面接著 U+0301,只會改變 ASCII 的 e,而組合的銳音符號則保留在原位,因此變音符號仍會渲染在新字母的上方。表情符號如 🙂 會維持原樣的 UTF-16 代理對,因為這兩個程式碼單元都不是 ASCII 字母。ROT13 謎題答案中的數字與標點符號也會直接通過,這正是讀者即使在解碼每個字母之前,仍能辨識編碼句子的結構的原因。
在瀏覽器中解碼或編碼 ROT13
對於較長的文字或任何包含混合字元的內容,將 ROT13 解碼器速查表付諸實踐的最快方式是使用一個本機瀏覽器工具,它會對每個 ASCII 字母套用相同的對應表,並保持其他字元不變。ROT13 編碼解碼器完全在目前的瀏覽器分頁中執行,因此輸入、輸出以及任何剪貼簿內容都不會被上傳。若要解碼 ROT13 字串,請貼上該字串並再次按下相同的 ROT13 按鈕。
- 將文字貼到輸入區。內容可以包含任何組合的 ASCII 字母、數字、標點符號、空白字元、帶腔調字元或表情符號。
- 選擇「套用 ROT13」來執行轉換。工具會顯示旋轉後的輸出,並同時報告實際有變動的 ASCII 字母數量。
- 讀取結果。若來源已經是 ROT13 編碼的文字,輸出即為解碼後的原文;若來源為純文字,輸出則為編碼後的結果。
- 將結果複製到剪貼簿,或將新的輸出再次貼回輸入區並第二次套用 ROT13,以確認此操作確實是自身的反函數。
輸入上限為 1,000,000 個 UTF-16 程式碼單元,這表示正好達到邊界的字串會被完整接受並完成轉換,而超過邊界一個程式碼單元的字串則會被拒絕並顯示明確的錯誤訊息;不會進行切片、取樣、縮短或靜默截斷。編輯來源會立即移除先前的結果以及任何錯誤或複製狀態,因此過期的解碼值不會殘留在畫面上。剪貼簿寫入是非同步的,因此工具會使用世代識別碼來防止舊的待處理完成事件發布過期狀態,而若剪貼簿存取被拒絕,則唯讀輸出仍可供手動選取。
實作範例:解碼一個短詞
若要親眼見識速查表的運作,請將 ROT13 字串 "PELCGB" 解碼成一個真實的單字。逐一檢視每個字元,在表中查找其對應字母,並以相同的大小寫寫下該夥伴字母。
- P → C,因為 P 是第 16 個字母,其向前 13 步的夥伴為 C。
- E → R,因為 E 是第 5 個字母,加上 13 會落到 R。
- L → Y,因為 L 加上 13 在 26 個字母的循環中會繞回 Y。
- C → P,這與第一步對稱,正顯示出對應表為何會形成配對。
- G → T,因為 G 加上 13 會繞到 T。
- B → O,因為 B 加上 13 會落到 O。
依序讀取這些夥伴字母即可拼出 CRYPTO,這就是原始的明文。由於 ROT13 是自身的反函數,對 CRYPTO 執行相同的操作會還原為 PELCGB。解碼後的詞組與編碼後的詞組可以互換:兩者互為對方經過一次 ROT13 處理的結果,而第三次處理則會將文字翻回 ROT13 形式,因為每個奇數次處理會產生編碼字串,每個偶數次處理則會還原原始文字。這種往返行為正是確認對應表是否正確套用的最乾淨方式。
ROT13 不會做的事
ROT13 是一種公開的替換式密碼,而不是一種安全性基元。它沒有金鑰,每個實作都使用相同的固定 13 步位移,任何認得 ROT13 的人都可以透過再次套用相同的操作來還原。因此,它絕不能用於保護密碼、權杖、個人資訊、私密訊息或正式環境設定。Python codecs 說明文件僅將 rot_13 描述為一種字串對字串的文字轉換,而 RFC 1855 則記錄了它在早期網際網路論壇中作為隱藏劇透或讀者可能不想意外看到的內容的歷史角色。那屬於隨意的可逆混淆,而非機密性、驗證、完整性保護、雜湊或存取控制。
此工具同樣刻意不實作相關的轉換。它不會執行任意的凱撒位移、數字的 ROT5、ROT18、ROT47、Unicode 轉寫、具語言感知能力的替換、壓縮或加密。當需要任意的 ASCII 位移時,凱撒密碼解碼器接受可設定的位移,同時保留大小寫、標點符號、數字以及非 ASCII 文字。當真正需要機密性時,經過稽核的加密系統才是正確的工具,而非 ROT13。牢記這個界線,才能把 ROT13 從一個誤導性的安全性主張,轉變回它當初被設計出來的那種無害的文字小把戲。
快速參考:ROT13 速查表規則
完整的速查表可以化為少數幾條在任何支援的輸入上都成立的規則,無論長度為何。下列規則將表格與實作範例所展示的內容彙整於一處,讓你在解碼或編碼詞組時能一目了然地查閱。
- 大寫 A 到 Z 在大寫範圍內旋轉,小寫 a 到 z 在小寫範圍內旋轉;大小寫絕不會互換。
- 26 個字母的對應表分成 13 對,因此夥伴的夥伴必定是原始字母。
- 套用兩次轉換會完整還原原始字串,包括每一個保留的非 ASCII 字元。
- 任何位於 ASCII A–Z 與 a–z 之外的字元,包括數字、標點符號、空格、腔調符號、CJK 字元以及表情符號,皆會原封不動地保留。
- 以 UTF-16 程式碼單元計算的輸出長度永遠等於輸入長度,因為每個被轉換的 ASCII 字母恰好會被一個 ASCII 字母取代。
掌握了字母表、非 ASCII 規則以及自身反函數的特性後,任何 ROT13 字串都能透過讀取表中的配對來解碼,或透過本機瀏覽器工具再次執行相同的操作來解碼。這兩者的結合就是完整的 ROT13 解碼器速查表:一張 13 對的對應表、一個嚴格的 ASCII 範圍,以及一個保證只要再多一次處理就能將文字帶回原點的承諾。
若想深入了解,請參閱如何記錄使用 ROT47 編碼解碼器的步驟。
若想深入了解,請參閱UTF-8 編碼 / 解碼器替代方案:嚴格、本機、致命。