ROT47 是一種替換方式,會將 ! (代碼 33) 到 ~ (代碼 126) 之間每個可列印 ASCII 字元,在其 94 個字元的範圍內剛好旋轉 47 個位置,因此套用該運算兩次必定能還原原始文字。這種自我反轉的特性是正確使用任何 ROT47 編碼解碼器的基礎,因為這代表同一個動作既能編碼也能解碼,不需要金鑰、模式或獨立的碼本。實際上的正確使用取決於三件事:貼上你想轉換的精確文字、套用一次 ROT47 並複製產生的可列印 ASCII 替換結果,以及再次套用該運算以確認輸出。當這三個步驟一致時,工具的行為就是確定性的,並能保持位置、長度與旋轉範圍外的每個字元不變。本文的其餘部分將詳細說明正確使用的樣貌,包括輸入規則、自我反轉保證背後的數學原理、絕不應該被改變的字元,以及讓完全有效的 ROT47 結果看起來錯誤的最常見陷阱。

how do i make sure i use rot47 encoder decoder correctly
如何正確使用 ROT47 編碼解碼器?

「正確使用」對 ROT47 編碼解碼器意味著什麼

在這個情境下,「正確」是一份固定的契約,而不是品味問題。ROT47 編碼解碼器僅作用於一個區間 — 即代碼點 33 (!) 到代碼點 126 (~) 之間的 94 個可列印 ASCII 字元 — 並將每個字元向前旋轉 47 個位置,在區間末端時則會循環回頭。區間外的每個字元都會原封不動地複製,包括代碼點 32 的空格字元、每個 tab 與換行字元,以及每個非 ASCII 代碼點 (例如帶腔調字母、CJK 表意文字與表情符號)。這個轉換是確定性的且保留位置:十個可列印 ASCII 字元的字串會產生十個位於相同位置的旋轉字元,混合文字會保留相同的空白字元與圍繞它們的非 ASCII 段落,而再次套用該運算會將每個值推進 94 個位置並還原為原始輸入。正因為這份精確的契約,正確使用可歸結為四項檢查:輸入未經修改地貼上、輸出保留每個字元的精確位置、可列印 ASCII 字元數不變,以及第二次套用會逐字還原輸入。這套 ROT47 編碼解碼器 在瀏覽器中實作了這份契約,這代表它會逐一走訪 Unicode 代碼點、檢查每個值是否落在可列印 ASCII 區間內、原封不動地複製區間外的所有內容 (不做正規化),並且絕不改動非 ASCII 段落。

以正確的方式套用 ROT47

每當你想要保證正確的結果時,請依照下列步驟。無論是編碼或解碼,工作流程都相同,因為一個運算就能同時完成兩者。

  1. 將你想轉換的精確文字貼到輸入欄位中。不要修剪前後空白、不要替換為智慧引號,也不要轉換換行字元 — 工具會保留所有這些內容。
  2. 確認你打算旋轉的字元確實落在代碼點 33–126 之內。任何落在該範圍外的字元 (包括空格、tab、換行、帶腔調字母與表情符號) 都會原封不動地出現在輸出中。
  3. 選擇 Apply ROT47。這個按鈕會執行那一次自我反轉的替換;沒有模式切換,也沒有金鑰欄位。
  4. 從輸出區域複製產生的可列印 ASCII 替換結果。在貼到其他地方之前,先檢查其中是否不小心含有需要跳脫的 URL、HTML、shell 或 regex 中繼字元。
  5. 若要解碼,請將 ROT47 字串貼回同一個輸入欄位並套用一次該運算。輸出應該會與原始文字逐位元組相符。
  6. 如果還原後的文字不相符,最可能的原因是傳輸過程中的某個環節 — 剪貼簿、論壇、Markdown 轉譯器 — 跳脫了標點符號、轉換了智慧引號,或正規化了換行字元。請從來源重新貼上並重做一次。

白話解釋自我反轉特性

一個按鈕能同時處理編碼與解碼的原因,在於 47 正好是 94 的一半。每個可列印 ASCII 字元會被映射為 33 + ((value − 33 + 47) mod 94);模運算的循環特性會把每個受支援的字元與其前方 47 步的另一個字元配對。第二次套用該運算會再加上 47、合計 94,而因為 94 mod 94 等於 0,每個受支援的字元都會回到原本的代碼點。這就是為什麼沒有獨立的解碼模式,也不需要記住任何金鑰。下表展示了它與更為人熟知的 ROT13 之間的差異,後者只旋轉字母。

特性ROT47ROT13
旋轉範圍ASCII 33–126 (94 個字元)A–Z 與 a–z (52 個字母)
旋轉量47 個位置13 個位置
被改變的字元字母、數字、標點與符號僅限字母
自我反轉是 — 一個按鈕雙向使用是,但僅作用於字母
保留空格 (代碼 32)會保留,因為它落在範圍之外會保留,因為它不是字母
保留非 ASCII會保留 — 原封不動地複製會保留,但各家實作不一
加密強度無 — 純屬益智編碼無 — 純屬益智編碼

若想更深入了解為何同一個運算能還原原文,ROT47 是否需要獨立解碼器 這篇指南會逐步說明其中的模運算。

工具不會動到的部分

了解哪些東西「不應該」改變,是正確使用的一半。下表摘要列出工具在每次執行時保證遵守的四項保留規則。

代碼點範圍範例會發生什麼
低於 33Tab (9)、換行 (10)、空格 (32)原封不動地複製 — 絕不旋轉
33–126 (會旋轉)! " # A B 0 9 ~位移 47 個位置並循環
高於 126é ñ 中 🚀原樣複製 — 不做正規化,也不拆 UTF-16
順序與長度輸入 10 個可列印 ASCII 字元輸出 10 個旋轉字元,位置相同

空格不會被動到的原因很直接:它位於代碼點 32,只比 33–126 的旋轉區間低一點。Tab 與換行的位置更低,同樣會被原封複製。非 ASCII 字元遠在區間之外,所以工具會把它們當作 Unicode 代碼點 一一走訪,然後原樣輸出,而不是強迫它們走 ASCII 流程或把它們拆成 UTF-16 的兩個半段。實際上的效果是,像 "café latte ☕" 這種混合文字,重音與表情符號都會保持原樣,而其中的空格與周圍的單字只會在其 ASCII 部分進行旋轉。

讓有效結果看起來錯誤的陷阱

即使工具本身是正確的,週遭的環境仍可能讓有效的 ROT47 結果看起來壞掉。請注意以下情況。

  • 標點意外被旋轉。因為逗號、方括號、數字與符號都落在 33–126 範圍內,所以 Hello123! 的輸出看起來像是被攪亂的標點,而非被攪亂的字母。如果你需要只針對字母的攪亂,那就是 ROT13 的設計用途。
  • 智慧引號與破折號被轉換了。如果來源文字中含有從文書處理器來的「智慧型」花括號引號或 em dash,編碼後的文字可能會包含這些字元的旋轉版本,但傳輸層 (論壇、CMS、終端機) 接著可能會再把它們轉換回來,導致還原失敗。
  • 換行字元在傳輸過程中被改變。Windows 的 CRLF 與 Unix 的 LF 在輸入時都會被保留,但若經過會把換行字元扁平化的網頁表單複製貼上,還原後的文字就會缺少原本的換行。
  • 輸出被貼到另一種語法中。因為標點會被轉換,旋轉後的字串可能含有在 URL、HTML 屬性、shell 命令、正則表達式或 Markdown 範圍中具有特殊意義的字元。若未跳脫就貼上,接收端的系統會重新解讀它。
  • 不小心重複套用。把已經編碼過的字串再編碼一次,總共會旋轉 94 步並回到原文,這可能會讓快速目視檢查的人誤以為工具壞了。
  • 輸入超過 200,000 個代碼點的上限。工具會直接拒絕空白的輸入,並限制長度以維持轉換的反應速度;非常大的貼上內容需要先自行切分。

若想更完整地查看錯誤清單與復原方式,避免使用 ROT47 編碼解碼器時犯錯 這篇指南會逐一搭配範例說明每個陷阱。

用三個快速檢查驗證結果

正確使用不只在於產生輸出;還包括能夠確認輸出是對的。三個簡短的檢查就能抓到幾乎所有的錯誤。

  1. 往返檢查。把輸出貼回輸入欄位並套用一次 ROT47。結果應該與原始文字完全一致,逐字元相符。如果相符,就代表旋轉正確,且傳輸過程中沒有任何東西改動字串。
  2. 字元數檢查。計算輸入與輸出中可列印 ASCII 字元的數量。兩者應該相等,且位於相同位置。工具絕不會在旋轉範圍內重新排列、刪除或複製字元。
  3. 邊界檢查。檢查輸入的第一個與最後一個可列印 ASCII 字元,並確認它們的旋轉結果落在你預期的位置。例如 ! (代碼 33) 會變成 P (代碼 80),~ (代碼 126) 會變成 O (代碼 79);A (代碼 65) 會變成 p (代碼 112)。如果邊界字元不符,你所用的實作可能採用了不同於 33–126 的區間。

如果三項檢查全部通過,結果在建構上就是正確的;如果有任何一項不通過,最可能的嫌疑犯是工具看不到的東西,例如剪貼簿的跳脫處理或換行字元的轉換。

ROT47 適用的時機 — 以及不適用的時機

正確使用也意味著針對目標選對工具。ROT47 非常適合用於論壇上的輕度暴雷遮罩、課堂上展示替代密碼、遊戲之夜的可還原益智編碼,以及測試下游管線如何處理包含標點與數字的字元。它刻意設計得很明顯:任何認出這個模式的人都能再套用一次 ROT47 將其還原,因此它不提供機密性、完整性、認證,也無法抵抗頻率分析。

當目標是真正的機密時,請改用其他工具。對於密碼、API token、個人資料,或任何必須抵禦攻擊者的內容,請採用真正的加密原語,例如 AES-GCM、用於完整性的 HMAC,或經過審核的密碼管理員。在需要線路上傳輸位元組的環境中,Base64 或 URL 編碼更為合適,且能保留不同的字元類別。若要進行只攪亂字母、保持標點不動的處理,ROT13 是歷史上的標準答案。