ROT13 是一種自我反函式的字母替換,會將每個 ASCII 大寫 A–Z 與小寫 a–z 恰好位移 13 個位置,而保留數字、標點、組合附加符號、帶附加符號的拉丁字母、希臘文、斯拉夫文、阿拉伯文、CJK 字元,以及 emoji 原封不動。由於英文字母共有 26 個字母,將某個字母位移 13 兩次即會還原為起始值,這正是為什麼同一個操作既可加密也可解碼同一段字串。一位搜尋 ROT13 decoder bash 解法的讀者,通常只想要在不必開啟重量級編輯器的情況下,最快速地翻轉文字,而在終端機中的標準答案就是搭配兩個對應字元類別的 tr 翻譯工具。ROT13 Encoder Decoder 可以在瀏覽器分頁中執行完全相同的替換,省去對 Unix shell 的依賴、在結果旁邊顯示被變更字母的數量,並在任何轉換執行前套用一道硬性的一百萬 UTF-16 程式碼單元上限防護。

ROT13 標準的 Bash 單行指令
大多數用於 ROT13 的 bash 單行指令都依賴 POSIX tr 指令,它會將一組字元翻譯為另一組。經典的呼叫方式是將字母表的後半段對應到前半段,反之亦然,產生標準的 ROT13 對照表。第一個參數定義來源集合(大寫 A–Z 加上小寫 a–z),第二個參數定義目的集合(大寫 N–Z 加上 A–M,接著小寫 n–z 加上 a–m),tr 接著會對來自標準輸入的每個位元組執行這個對應。反轉方向——將 Hello, World! 透過同一個指令管線傳送——會得到 Uryyb, Jbeyq!,因為這個替換本身就是其自身的反函式。同樣模式的變形也出現在讀取檔案、使用 read 接收使用者輸入,或將管線包裝在某個函式(例如在使用者 shell rc 檔中定義的 rot13 別名)內的 shell 腳本中。這些 bash 方法沒有一個是錯的,且每一種都能在任何隨附 GNU 或 BSD coreutils 的 Linux、macOS 或 BSD 系統上運作。
Bash 管線的不足之處
bash 管線快速且零相依,但它預設了一個可運作的 shell、locale 正確的位元組處理,以及一個熟悉組合管線的使用者。以下三個具體情境會促使讀者轉向瀏覽器方案。首先,tr 方法是針對位元組運作,因此任何與來源檔案編碼不相符的使用者自訂字元類別,都可能在 UTF-8 輸入上產生意外的輸出,特別是在帶附加符號的字母與 emoji 上。其次,透過 echo 貼上時,意外出現的 shell 中繼字元(驚嘆號、美元符號、反引號,以及歷史擴充標記)會在 tr 看到內容之前就先被展開,悄悄地毀掉輸出。第三,指令只會回傳一段字串而不附帶任何後設資料,因此讀者沒有內建方法可以驗證有多少字母被變更、輸入是否已達上限、或空輸入是否觸發了錯誤狀態。瀏覽器工具能明確呈現這些訊號,一次解決所有 shell 引號使用上的陷阱。
如何使用瀏覽器工具解碼 ROT13
- 在目前的瀏覽器分頁中開啟 ROT13 Encoder Decoder。整個頁面完全在用戶端執行,因此不會有任何資料離開你的裝置。
- 將想要位移的文字貼到輸入區域中。本工具接受任何由 ASCII 字母與其他字元混合而成的內容,上限為一百萬個 UTF-16 程式碼單元。
- 選擇 Apply ROT13 動作。轉換會立即執行,結果會連同被變更 ASCII 字母的數量一起顯示在輸出區域中。
- 使用內建的控制項複製輸出。若瀏覽器拒絕剪貼簿權限,完整的唯讀輸出仍會保持可見狀態,方便手動選取。
- 若要還原原始字串,請將轉換後的輸出再次貼回輸入區域,並再次套用 ROT13。自我反函式的特性保證結果與原始來源逐位元組相符。
ROT13 變更了什麼、又保留了什麼
這個位移只會影響兩個 ASCII 字母表。其餘每一個程式碼單元——數字、標點、空白、Tab 鍵、換行、NUL、符號、組合附加符號、帶附加符號的拉丁字母、希臘文、斯拉夫文、阿拉伯文、CJK,以及 emoji——都會維持原封不動,並計為零次變更。下表整理了這些規則,並為每一列提供一個具體的範例。
| 字元類別 | ROT13 行為 | 範例 |
|---|---|---|
| ASCII A–Z | 位移 13,保留大寫 | A → N,M → Z |
| ASCII a–z | 位移 13,保留小寫 | a → n,m → z |
| 數字 0–9 | 保持不變 | 7 → 7 |
| 標點與符號 | 保持不變 | ! → ! |
| 帶附加符號的拉丁字母 | 保持不變 | é → é |
| CJK、希臘文、斯拉夫文、阿拉伯文 | 保持不變 | 中 → 中 |
| Emoji | 代理對保持不變 | 😀 → 😀 |
| NUL (U+0000) | 視為一般字串資料處理 | NUL 位元組直接通過 |
從這個表格可以推導出兩個必然結果。首先,當數字或非 ASCII 字元出現時,被變更字母的計數永遠不會增加,因為這個計數只追蹤相符的 ASCII 字母。其次,每個被轉換的 ASCII 程式碼單元會剛好被另一個 ASCII 程式碼單元取代,因此以 UTF-16 程式碼單元計算的輸出長度永遠等於輸入長度。"café" 一詞會變成 "pnsé",正是基於這個原因:c、a 和 f 會被位移,而預先組成的 é 因為不是 ASCII 字母而留在原處。
實作範例:HELLO 變成 URYYB
經典的 HELLO 範例是用來查看這個公式最簡單的方式。轉換採用 ASCII 碼點算術:對於每個大寫字母,先減去 65、再加 13 取模 26、最後再加回 65;至於每個小寫字母,則改用 97 取代 65。對 H-E-L-L-O 套用大寫字母公式,逐步計算如下:
- H:72 − 65 = 7;7 + 13 = 20;20 mod 26 = 20;20 + 65 = 85 → U
- E:69 − 65 = 4;4 + 13 = 17;17 mod 26 = 17;17 + 65 = 82 → R
- L:76 − 65 = 11;11 + 13 = 24;24 mod 26 = 24;24 + 65 = 89 → Y
- L:計算過程相同 → Y
- O:79 − 65 = 14;14 + 13 = 27;27 mod 26 = 1;1 + 65 = 66 → B
輸出為 URYYB。對 URYYB 重複執行相同的步驟就會還原為 HELLO,這在五個字元中展現了自我反函式的特性。任何實作良好的 ROT13 常式——bash tr、瀏覽器工具,或 Python codecs 模組——對這五個字元都會產生完全相同的輸出。Python 官方文件將 rot_13 定義為一個字串對字串的文字轉換,而 CPython 原始碼也提供了用於交叉比對的精確字母表,如同 Python codecs documentation 中所述,亦可從 CPython rot_13 codec source 看到。
瀏覽器工具的常見使用情境
ROT13 數十年來一直出現在 Usenet、郵件論壇與線上討論區中,作為一種輕量的方式來模糊化劇透、解題答案或略微離題的笑話,避免一眼就被看穿。一位僅需要解碼單一區塊文字的讀者,通常不想開啟終端機、輸入管線、記住精確的字元類別順序,或修正歷史擴充。只要把文字貼進瀏覽器的欄位中再點擊一次,就能產生相同的結果。其他實用的用途包括:檢查日誌檔中的某段樣本是否經過編碼、將一段字串雙重位移以確認它確實是 ROT13 而非其他凱撒位移,以及為學生提供一個顯而易見的自我反函式替換密碼實作範例。需要不同位移值的讀者可以使用 Caesar Cipher 工具,該工具會直接顯示位移量。
ROT13 並非加密
ROT13 沒有金鑰,每次都套用同一套公開的替換規則,因此任何辨識出這個模式的人,只要再套用相同的操作就能立即還原。這使得它適用於休閒性的可逆混淆——隱藏劇透、淡化笑話、將討論串標記為離題——但絕不能用於保護密碼、權杖、個人資料、私密訊息或正式環境組態設定。此工具本身並不宣稱具備任何密碼學性質:所有的轉換、計數和剪貼簿準備動作,都只在瀏覽器分頁中於本機執行,不會上傳任何輸入、輸出或剪貼簿內容;若輸入超過一百萬 UTF-16 程式碼單元,則會顯示明確的警告。編輯來源會立即清除先前的結果、驗證錯誤、統計資料和複製狀態,而重新套用該操作則會以全新的輸出覆蓋該狀態。對於真正的機密性、認證、完整性或存取控制而言,經過稽核的既有密碼學系統仍舊是唯一可接受的選項。
如果你正在權衡各種選項,Char Code Lookup From the Command Line vs Online 對此有詳細說明。
如果你正在權衡各種選項,A1Z26 Cipher Decoder: Decode Numbers Into Letters 對此有詳細說明。