ROT13 是對 26 個字母的拉丁字母表套用恰好 13 個位置的凱撒位移,因此同一個運算既能編碼也能解碼——把這個轉換再執行一次,就能把每個 ASCII 字母還原成起始值。因此 ROT13 解碼器並不是一套獨立的演算法;它就是用來編碼的同一種替換方式,套用在已經被旋轉過的文字上。只有 ASCII 的 A 到 Z 與 a 到 z 會被對應轉換,這讓大寫與小寫彼此獨立,並讓其他每一個字元——數字、標點符號、空格、重音符號、中日韓文字與表情符號——完全維持原樣。這個轉換之所以對稱,是因為 26 除以 2 等於 13,這代表 13 步的位移會讓每個字母落在字母表繞一圈之後的正中間位置,而第二次 13 步的位移則會完成整個旋轉,回到起點。Python 的 codecs 文件把 rot_13 定義為一種字串對字串的文字轉換,而 CPython 的原始碼也提供了直接的大寫與小寫字母對照表,證實了這種行為。從這些事實可以得出一些實務上的結論:輸出長度永遠等於輸入長度,把這個運算套用兩次會完全還原原始內容,而且這個工具不提供任何機密性,因為任何認得出這種轉換的人,都不需要金鑰就能把它反過來還原。

ROT13 解碼器做的是什麼
ROT13 解碼器接收一段字串,並套用經典的「旋轉十三位」轉換。每個大寫的 A 到 Z 會在字母表中向前移動 13 個位置,到 Z 之後會繞回 A,而小寫的 a 到 z 也獨立套用同樣的規則。A 變成 N,B 變成 O……M 變成 Z,接著 N 變成 A,O 變成 B……Z 變成 M。因為字母表有 26 個字母,而 13 恰好是 26 的一半,這個對應會把每個字母都配對到它的鏡像對應字母——沒有任何不動點,在 ROT13 之下,沒有任何字母會對應到自己。這就是整個演算法。
這個工具不會轉換數字、標點符號、空白字元,或這兩套 ASCII 字母表以外的任何字元。像 é 這樣帶重音的字母、一個中文字,或一個表情符號的代理對,都會原封不動地保留在輸入中的樣子。這與官方的 rot_13 編解碼器一致,Python 把它定義為一種只套用在這兩個碼元範圍內的窄範圍文字轉換。任何應該在來回轉換中存活下來的內容——一段加了引號的短語、一個標點符號、一個網址中的位元組邊界——都確實會存活下來。
一個實際的結果是,你可以貼上像電子郵件地址、帶有引號與逗號的句子,或包含帶重音拉丁字母的一行文字這類混合內容,而只有 ASCII 字母會被移動。輸出長度以 UTF-16 碼元計算會等於輸入長度,因此原始文件的版面配置得以保留。
如何在你的瀏覽器中解碼 ROT13 文字
依照以下三個步驟,使用以瀏覽器為基礎的ROT13 Encoder Decoder來解碼 ROT13 文字。
- 把 ROT13 編碼過的文字貼進輸入欄位。這段文字可以混合任何 ASCII 字母與其他字元——標點符號、數字、重音符號、中日韓文字與表情符號都能接受。
- 套用 ROT13,並檢視轉換後的輸出,連同已變更 ASCII 字母的計數。這個計數器回報的是有多少個碼元位置被對應轉換,這個數字也等於輸入中 ASCII 字母的數量。
- 複製解碼後的結果,或者如果你需要重新編碼,就再對這個結果套用一次 ROT13。因為這個轉換是自身的反函式,對輸出再執行一次相同的運算,就會回到完全原始的輸入內容。
如果你的瀏覽器拒絕了剪貼簿存取,唯讀的輸出仍會留在畫面上,讓你可以手動選取。編輯輸入內容會立即清除先前的結果、任何驗證錯誤、統計面板,以及複製狀態。執行一次新的轉換,在發布自己的輸出之前也會做同樣的事,因此畫面絕不會顯示來自先前操作的過時狀態。邊界處不會有任何內容被切割、抽樣或縮短,因此結果會完整反映你提供的全部輸入內容。
哪些內容會被轉換,哪些內容維持不變
ROT13 的行為刻意設計得很窄。下表比較了三種經典文字轉換,在你選擇該用哪一種時需要考量的各個面向。
| 屬性 | ROT13 | 凱撒密碼 | ROT47 |
|---|---|---|---|
| 旋轉的字母表範圍 | ASCII A–Z 與 a–z | ASCII A–Z 與 a–z | 可列印 ASCII(33–126) |
| 位移量 | 固定為 13 | 可調整(通常為 1 到 25) | 固定為 47 |
| 自身可逆 | 是 | 否(需要對應的位移量才能還原) | 是 |
| 大小寫是否保留 | 是 | 是(在標準慣例中) | 否(大小寫也屬於被對應的範圍) |
| 數字是否轉換 | 否 | 否 | 是 |
| 非 ASCII(重音符號、中日韓文字、表情符號) | 不變 | 不變 | 不變 |
| 典型使用情境 | 針對純字母文字的輕鬆可逆混淆 | 謎題與可調整位移 | 針對混合可列印文字的輕鬆混淆 |
具體來說,"Hello, World!" 在 ROT13 之下會變成 "Uryyb, Jbeyq!"——逗號、驚嘆號與空格維持不變,而十個 ASCII 字母則旋轉了 13 位。短語 "café" 會變成 "pnsé":三個 ASCII 字母 c、a、f 各自移動到它們的鏡像對應字母,而組合字元 é(U+00E9)則完全停留在原本的位置,因為 ROT13 並未為非 ASCII 碼位定義任何旋轉規則。
每個字母背後的數字範例都很直接。以 H 為例,它位於大寫字母表的第 7 個位置(A=0,B=1……H=7)。這個轉換先減去 65 得到從零開始的索引,再加上 13,然後對 26 取餘數:7 + 13 = 20,20 除以 26 的餘數是 20。再加回 65 得到 85,這正是 U 的 ASCII 代碼。因此這對鏡像對應是 H ↔ U。對 U 再套用一次相同的公式:位置 20,加上 13 對 26 取餘數是 7,再加上 65 是 72,也就是 H——證實了這個來回轉換。
為什麼 ROT13 是自身的反函式
同一個函式既能編碼又能解碼的原因,純粹是算術上的。拉丁字母表有 26 個字母,而 13 恰好是 26 的一半,因此 13 步的旋轉,會把每個字母對應到它的相對位置。這裡沒有任何不動點——在 ROT13 之下,A 永遠不會變成 A,Z 也永遠不會變成 Z——而第二次 13 步的旋轉,會把每個字母送回它的起點。字母表的兩半彼此配對,例如 A↔N、B↔O、C↔P,一路延續到 M↔Z。
Python codecs documentation把 rot_13 定義為一種字串對字串的文字轉換,而CPython rot_13 source則提供了實作這個對應關係所需的直接大寫與小寫字母對照表。這兩套字母表被獨立處理,因此大小寫得以保留,小寫字母絕不會變成大寫字母。因為每一種受支援的輸入,都能透過對轉換套用兩次而完成來回轉換,所以這個解碼器不需要任何額外的中繼資料——不需要金鑰、不需要位移參數,也不需要方向旗標。
這項特性也代表,任何認得出這種轉換的人,都能輕易把它反過來還原。如果你需要一個位移量可調整的凱撒變體,Caesar Cipher Decoder能套用一個選定的位移量,同時保留大小寫、數字、標點符號與非 ASCII 字元。對於包含數字與標點符號的可列印 ASCII 文字,自身可逆的 ROT47 轉換是一個有用的替代方案。
輸入限制與邊緣情況
這個工具在執行任何轉換之前,會先強制執行兩項硬性限制。空白輸入會被拒絕,並顯示明確訊息,因為沒有內容可供轉換。超過 1,000,000 個 UTF-16 碼元的輸入,也會在轉換之前被拒絕——剛好落在邊界上的文字會被接受並完整轉換,但超出邊界哪怕只有一個碼元也會被拒絕。沒有任何內容會被切割、抽樣、縮短,或靜默地截斷,因此你可以信任輸出結果完整反映了你提供的全部輸入。
有幾種邊緣情況值得了解:
- 沒有任何 ASCII 字母的非空輸入是有效的,並會產生變更計數為零的結果。一行數字、一串表情符號,或一連串中日韓文字,回傳時會維持不變。
- NUL(U+0000)會被當成一般的字串資料處理,而不是當成 C 風格的終止符。它不會截斷你的輸入或輸出。
- 像字母 e 後面接著 U+0301(組合用重音符號)這樣的組合序列,只會改變 ASCII 的 e,並讓組合標記維持原位。可見的字形會改變,但序列的結構會被保留。
- 使用 UTF-16 代理對的表情符號,會被當成兩個碼元處理,這兩個碼元都落在 ASCII 字母表之外,因此都會維持不變。
編輯輸入內容會立即清除先前的結果、任何驗證錯誤、統計面板,以及複製狀態。執行一次新的轉換,在發布自己的輸出之前也會做同樣的事。剪貼簿寫入是非同步的,每一次複製嘗試都會拿到一個世代識別碼:如果輸入內容已被編輯、元件已被卸載,或已經有更新的複製動作正在進行中,較舊、仍在等待完成的複製動作就無法還原成過時的狀態。如果剪貼簿權限被拒絕,完整的唯讀輸出仍會保持可見,供你手動選取。
什麼時候該用 ROT13(什麼時候不該用)
最好把 ROT13 理解成一種輕鬆、可逆的混淆方式。歷史上,USENET 曾用它來隱藏劇透、謎題答案,或一般讀者可能不希望不小心看到的內容。它很適合扮演這個角色,因為任何認得這個慣例的人,都能一步就把它還原,而且沒有人需要金鑰、工具或帳號就能讀到原文。
它不是加密。沒有秘密金鑰、沒有金鑰衍生過程,也沒有完整性檢查。這張替換表是公開的,再套用一次永遠都能還原出原始內容。請不要用 ROT13 來保護密碼、API 權杖、工作階段 cookie、個人資訊、私密訊息、正式環境設定,或任何其他機密內容。如果需要真正的機密性、身分驗證或完整性保護,請使用經過稽核的密碼系統——例如金鑰永遠不會離開你機器的AES-256-GCM——或瀏覽器之外的成熟函式庫。
如果你在意的只是不希望搜尋引擎、自動化爬蟲,或隨意瀏覽的訪客一眼就能索引或看到某段文字,ROT13 是一個合理的慣例。如果你在意的是完全不想讓任何人讀到這段文字,ROT13 就是用錯了工具。
當 ROT13 是用錯工具時的替代方案
有三種情況需要用 ROT13 以外的工具,而每一種都有明顯更合適的選擇。
你需要一個可調整的位移量。ROT13 固定在 13。如果需要任意大小的凱撒位移,請使用 Caesar Cipher Decoder,它能套用一個選定的位移量,同時保留大小寫、標點符號、數字與非 ASCII 字元。
你的文字中包含也想混淆的數字與標點符號。ROT13 會讓它們維持原樣。ROT47 會旋轉從 33 到 126 的可列印 ASCII 範圍,同樣也是自身可逆的。mistakes to avoid with a ROT47 encoder decoder這篇指南是值得一併閱讀的參考。
你需要以二進位安全的方式傳輸任意位元組。ROT13 是針對文字運作,也產生文字。如果要透過純文字通道編碼位元組,請使用Base64 Encode / Decode工具,它完整支援 UTF-8,並在本機執行。
這個轉換也不是壓縮、語言感知替換、Unicode 轉寫,或雜湊運算。如果你需要這些功能中的任何一種,請選擇真正為這項工作而打造的工具。