ROT47 在 94 個可列印 ASCII 字元(從驚嘆號 (!) 到波狀符號 (~))之間具有自我反轉特性,因此當結果看起來錯誤時,幾乎只要把輸出重新貼回同一個欄位,再按一次「套用 ROT47」就能還原原文。這組密碼會將範圍 33 到 126 之內的每個碼位剛好旋轉 47 個位置,讓每個字元與另一個字元配對,保證第二次處理時能回到原始字元。位於這個狹窄區間外的字元(包括空格(碼位 32)、定位字元、換行符、重音字母、CJK 文字和表情符號)都會原封不動地複製過去。這種不對稱正是結果看起來「不對勁」最常見的原因:空格與格式會保留下來,但數字、標點、大寫與小寫字母會同時位移。因此,只要知道同一顆按鈕就能處理兩個方向,還原操作幾乎都只是一次點擊,而不是一場除錯。如果第二次 ROT47 仍無法還原輸入,問題幾乎從來不是密碼本身,而是編碼與解碼之間某個中介程式對文字動了手腳,例如 HTML 跳脫(escaping)、智慧引號轉換或換行符號變更。

how do i fix a result that looks wrong after i use rot47 encoder decoder
修正使用 ROT47 後看起來錯誤的結果

在 ROT47 結果中「錯誤」通常代表什麼

當讀者說 ROT47 結果「看起來錯誤」時,他們通常指的是以下三種情況之一:編碼後的文字含有他們沒預料到的陌生標點、數字或符號;解碼後的輸出與原始訊息不符;或是輸出夾雜了來源中沒有的奇怪字元,疑似損毀。每種情況的原因與解法都不同,正確的第一步取決於實際碰上的是哪一種。

第一種情況其實不是錯誤。ROT47 會旋轉所有可列印 ASCII 字元,而非只有字母,所以逗號、方括號、& 符號、數字與引號都會和 A 到 Z 一起位移。習慣 ROT13(只處理英文字母)的讀者,常會把這種更廣泛的轉換誤認為程式缺陷。第二種情況幾乎都可追溯到密碼的自我反轉特性:套用 ROT47 兩次會回到原始文字,所以只要在輸入欄位點一次「套用 ROT47」按鈕,就能當場還原來源。

第三種情況,也就是真正損毀的輸出,幾乎都來自編碼器與下一位檢視者之間的中介程式。HTML 頁面、網址列、殼層、JSON 序列化器、論壇標記語法與所見即所得編輯器都會自行重新解讀標點。一旦 ROT47 輸出被這些程式處理過卻沒有再跳脫回來,原始位元序列就會遺失,再怎麼跑一次 ROT47 也無法重建。

再套用一次 ROT47 以還原原文

ROT47 在 94 個可列印 ASCII 字元範圍上數學上具有自我反轉特性。每個支援的碼位會對應到 33 + ((值 − 33 + 47) mod 94)。套用同樣的對應兩次,總共加上 47 兩次,也就是 94,而 94 mod 94 等於 0,所以字元會剛好回到原位。這就是為什麼單一顆「套用 ROT47」按鈕就能同時處理編碼與解碼,也因此不需要獨立的解碼模式。

用一個簡單的例子就能說明還原流程。字母 "A" 的碼位是 65。第一次處理時,編碼器將它對應到 33 + ((65 − 33 + 47) mod 94) = 33 + 79 = 112,也就是小寫字母 "p"。第二次處理時,編碼器將 112 對應到 33 + ((112 − 33 + 47) mod 94) = 33 + 32 = 65,再次得到 "A"。在 33 到 126 之間的每個碼位,這個來回都是精確的;而位於這個區間外的任何碼位(包括空格、定位字元、換行符或非 ASCII 字母),在兩次處理中都會原封不動地複製。

如何修正看起來錯誤的結果

還原流程很短,但步驟順序很重要。在認定編碼器出問題之前,請依序執行下列步驟。

  1. 原樣複製可疑的輸出,包括每一個空格、定位字元與換行符。
  2. 將複製的文字貼到 ROT47 編碼器/解碼器的輸入欄位。
  3. 點選「套用 ROT47」。因為對應具有自我反轉特性,結果應該會是原始文字。
  4. 逐字元比對還原後的文字與來源。空白字元與任何非 ASCII 字元應該都在完全相同的位置。
  5. 如果還原後的文字仍不相符,代表輸出在原本的 ROT47 處理之後又被修改過。請找出處理過該段文字的中介程式(無論是論壇、程式碼區塊、聊天用戶端、網址列、殼層或標記語法渲染器),並盡可能取回未經修改的位元組。

為何標點、數字與符號看起來不一樣

ROT47 涵蓋完整的可列印 ASCII 區間,從碼位 33("!")到碼位 126("~"),共 94 個字元。這個區間包含大寫字母、小寫字母、數字、標點,以及一長串符號,例如方括號、大括號、@ 符號、井號、美元符號與反斜線。它們在每次處理中都會旋轉 47 個位置,因此逗號可能變成 "["、左括號可能變成 "W",而數字 "7" 可能變成小寫字母 "f"。把 ROT47 與 ROT13 比較的讀者通常不會預期這種情形,因為 ROT13 只旋轉 26 個英文字母,而不會動到標點。

特性ROT13ROT47
旋轉的字元A–Z 與 a–z(52 個)碼位 33–126(94 個)
涵蓋範圍僅字母所有可列印 ASCII,包含數字與標點
自我反轉是(一次處理即回到輸入)是(一次處理即回到輸入)
對數字的影響不變旋轉(例如 7 ↔ f)
對空格(碼位 32)的影響不變不變
對非 ASCII(重音字母、CJK、表情符號)的影響不變不變

這個比較之所以重要,是因為「看起來錯誤」的結果,有時只是看起來陌生而已。逗號變成另一個符號,正是密碼按設計運作,而第二次處理會把那個符號變回逗號。

在你看到結果之前常見的損毀陷阱

ROT47 結果損壞最常見的原因根本不是編碼器,而是接收編碼文字並擅自改寫部分內容的目的端。下列情況都會以無法靠再一次 ROT47 修復的方式破壞原始位元。

  • HTML 或 XML 渲染:輸出中的 & 符號會被悄悄轉成 "&",小於符號會變成 "<",還原後的文字永遠對不上來源。
  • URL 編碼:把 ROT47 字串貼進網址列時,方括號、空格與許多符號會被百分比編碼,從瀏覽器再複製回來時會得到不同的位元序列。
  • 智慧引號轉換:所見即所得編輯器與部分聊天用戶會把直引號替換成彎引號,這些字元落在 33–126 範圍之外,因此根本不參與旋轉。
  • 換行符變更:Windows 與網頁系統使用 CRLF,而許多編輯器與殼層使用 LF。如果來源使用 CRLF,經過會剝除歸位字元的系統往返一次後,將無法得到相同的位元組。
  • 重複套用:在只需一次處理時卻套用 ROT47 兩次,常發生在讀者忘了輸入是否已經編碼過。
  • 截斷:聊天視窗、程式碼區塊或斷行處理層會無聲地丟掉結尾字元。

若讀者想獲得更完整的注意事項清單,避免在使用 ROT47 編碼器/解碼器時犯錯一文會逐一深入說明這些失敗模式。

確認空白與非 ASCII 內容保持原樣

本站使用的 ROT47 實作會明確保留 33–126 以外的碼位,因此如果一次還原處理沒有得到原文,就強烈代表有密碼以外的程式動過文字。根據 Unicode 基本拉丁文對照表,空格的碼位是 32,因此位於旋轉區間之外。定位字元與換行符落在 ASCII 控制字元範圍,同樣位於 33–126 之外。重音字母(例如 é)、CJK 文字與表情符號的碼位都遠高於 126,也都會原樣複製。若還原後輸出中的這些字元與原本不一致,代表有中介編輯器修改過文字,單靠再一次 ROT47 是修不好的。

當結果已無法修復

有時候第二次 ROT47 處理後得到的文字仍然錯誤,再繼續套用密碼也無濟於事。這時的還原做法是撤銷中介程式所做的變更,而不是繼續旋轉。經過 URL 編碼的輸出必須先百分比解碼回原始位元,再進行下一次 ROT47。經過 HTML 跳脫的輸出必須把實體參考再展開回原本的字元。智慧引號的轉換則要在往返處理之前,把彎引號換回直引號。換行符的差異則需透過把全部內容標準化為同一種換行慣例來解決。

如果原始訊息真的已經遺失(例如中介程式只儲存渲染後的版本而丟棄編碼版本),那 ROT47 的結果就無法還原,讀者應該從頭重新編碼原始內容。ROT47 編碼器每次都會產生相同的輸出,所以重新編碼是一種確定性的操作,而不是猜測。

也值得再次強調一項硬性限制:ROT47 是一種謎題式編碼,不是加密。任何看到編碼字串的人,只要套用同一套對應就能還原來源,並沒有祕密需要保護。它適合用於劇情遮罩、課堂練習、可逆的論壇謎題與管線測試,但不應用於保護憑證、個人資訊或任何其他敏感內容。若目的是機密性,正確的工具是真正的加密法,例如 AES-GCM,而不是可逆的字母旋轉。

延伸閱讀:開始使用 ROT47 編碼器/解碼器。