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

rot13 decoder for beginners
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)
ANNA
BOOB
CPPC
DQQD
ERRE
FSSF
GTTG
HUUH
IVVI
JWWJ
KXXK
LYYL
MZZM

小寫字母的對應方式相同,a 變成 n、n 變成 a、m 變成 z、z 變成 m。由於每一列對調的是相隔 13 個位置的兩個字母,因此每個 ASCII 字母必定會變成另一個不同的 ASCII 字母,所以「被對應的字母」計數永遠等於輸入中實際改變值的字元數量。

如何使用瀏覽器工具套用 ROT13

對初學者來說,解碼或編碼一段文字最快速的方法,就是把文字貼到一個以瀏覽器為基礎的 ROT13 解碼器中,按下一顆按鈕即可。ROT13 編碼解碼器 完全在你目前的分頁中執行轉換,所以你的文字從不離開瀏覽器。基本操作流程分為三個步驟。

  1. 把你的文字貼到輸入區。它可以包含 ASCII 字母、數字、標點符號、空格、重音字元、表情符號與 CJK 字元的任意組合;只有 ASCII 的 A–Z 與 a–z 字母會被移動。
  2. 選擇「套用 ROT13」。工具會掃描每個碼元,將每個 ASCII 字母轉換 13 個位置,完整保留所有其他碼元,然後顯示新字串以及被對應的 ASCII 字母數量。
  3. 如有需要,可將輸出複製到剪貼簿,或對該輸出再套用一次 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 移位時,請使用凱撒密碼工具;當你需要真正的機密性、身分驗證或完整性保護時,請使用經過稽核、成熟的密碼學系統。