要解讀 Rail Fence(欄柵)密碼,請使用與發送者相同的欄數與起始慣例,反轉其鋸齒狀換位順序,然後從最上方那欄依列序讀回重建的序列。Rail Fence 從不將字元替換成新字元;它只是在一組虛擬的平行欄上重新排列,因此解密過程是重建原始順序,而非替換成不同的字母。Rail Fence 密碼解碼器會在您的瀏覽器中執行反向操作,接受 2 到 100 之間的整數欄數,並保留每個 Unicode 碼位,包括空格、標點符號、換行字元以及表情符號。由於此密碼是完全確定性的,相同的輸入與相同的欄數必定產生相同的輸出,因此從密文成功往返還原回原始明文,便能有效確認雙方慣例相符。請將此往返視為僅能證明慣例相符,絕不能視為機密性或真實性的證明,因為 Rail Fence 只是一種歷史悠久的教學密碼,除了欄數本身之外並無真正的秘密。

Rail Fence 解密的運作原理
Rail Fence 是一種古典的換位密碼,經常被用來作為字元重排的第一個範例。加密時,發送者將明文以齒狀的圖樣寫入一組假想欄中,再由左至右讀取每一欄。解密時,則需反轉該操作:將密文切分成與每列大小相符的區塊,接著依原始的鋸齒位置逐一走訪,從每列各取出一個字元。
這個鋸齒圖樣本身遵循嚴密的節奏。從最上方那欄開始,書寫者每寫一個字元就下移一欄,直到最底端,再反轉方向往上爬升。對於 r 欄,字元 i 所屬的列遵循一個簡單的規則:計算 p = i mod 2(r−1);當 p 小於 r 時,列值等於 p,否則列值等於 2(r−1) − p。完整的圖樣週期長度為欄數的兩倍再減一。三欄的欄柵會以 0, 1, 2, 1 的順序循環,週期為 4;四欄的欄柵則以 0, 1, 2, 3, 2, 1 的順序循環,週期為 6。
| 欄數 | 週期長度 (2r − 2) | 每個週期的列序列 |
|---|---|---|
| 2 | 2 | 0, 1 |
| 3 | 4 | 0, 1, 2, 1 |
| 4 | 6 | 0, 1, 2, 3, 2, 1 |
| 5 | 8 | 0, 1, 2, 3, 4, 3, 2, 1 |
| 10 | 18 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1 |
| 100 | 198 | 0 through 99 and back to 0 |
解密並不靠猜測。它會計算每欄在鋸圖樣中佔有多少位置,將密文切分成大小完全相符的區塊,然後針對每個原始位置從對應區塊中取出一個字元。過程中不會加入填補字元,也不會略過任何一列,這也正是為什麼欄數必須完全吻合,輸出結果才會有意義。
會影響輸出結果的慣例
每個 Rail Fence 實作都有一些隱含的慣例,決定了不同工具所產生的密文是否一致。Rail Fence 密碼解碼器不使用起始偏移,從最上方那欄開始,先向下移動,並保留每個碼位——包括空格、標點符號以及表情符號等輔助 Unicode 字元。由於此頁面是直接逐個處理 Unicode 碼位,因此表情符號會被視為單一字元,而不會被拆成兩個 UTF-16 代理對的一半。
其他課堂版本與線上工具,有時會在以下幾點上有所不同,進而完全改變輸出結果:
| 慣例 | 本頁面 | 常見的替代作法 |
|---|---|---|
| 起始列 | 最上方欄 (第 0 列) | 最底欄或第 1 列 |
| 起始方向 | 先向下移動 | 先向上移動 |
| 起始偏移 | 無 | 一或兩個前置空白 |
| 空白字元 | 保留 | 編碼前先去除 |
| 大小寫 | 保留 | 全部轉為同一大小寫 |
當課本上的 Rail Fence 練習所給出的密文與此工具不同時,幾乎一定是上述慣例中的某一項所造成的差異。請先確認雙方的慣例一致,再相信往返結果或進行答案比對,同時請記得換行字元也會被視為字元參與運算,因此會改變鋸齒中所有後續位置。將慣例表與任何參考資料(例如 dCode 的 Rail Fence 頁面)交叉比對,是快速找出不一致之處的好方法。
逐步解讀 Rail Fence 密碼
要得到乾淨的解密結果,最快的做法就是使用當初產生密文的同一個工具。如果發送者使用的是本頁面,下列步驟就能精準還原明文。
- 開啟 Rail Fence 密碼解碼器,並將模式切換為「解密 (Decrypt)」。
- 輸入發送者所使用的欄數。該值必須是介於 2 到 100 之間的整數;若超出範圍,頁面會直接拒絕處理,而不是自動猜測。
- 將密文原封不動地貼上,包括每一個空格、標點符號、換行字元以及表情符號。不要去除空白,也不要調整大小寫,因為每個碼位都會參與鋸齒運算。
- 執行該操作並讀取結果區塊。介面會保留結果中的可見格式,而複製功能會寫出未經修剪的完整字串。
- 將結果以相同的欄數切回「加密 (Encrypt)」模式進行往返驗證。若加密結果與原始密文逐字相符,即可確認慣例一致;若不相符,請重新檢查欄數或上方的慣例表。
第五步應被視為確認步驟,而非安全性測試。往返驗證只能證明欄數與起始慣例相符;並不能證明訊息具有機密性或真實性。輸入上限為 200,000 個碼位,以確保即使貼上長篇內容也能保持回應速度;無效的欄數或空白的輸入會被分別回報為錯誤,而不是默默採用預設值。
找出正確的欄數
解密功能永遠不會替您猜測欄數。Rail Fence 密碼解碼器只會根據您輸入的欄數回傳結果,這是一項特性而非限制,因為發送者所使用的欄數是隱含金鑰的一部分。試以不同欄數來還原未知的欄數,是另一個獨立的密碼分析任務,並未內建於此工具中。
對於簡短的謎題而言,由於欄數是個小的整數,快速的暴力破解是可行的。兩欄的欄柵等同於交叉讀取字元;三欄的欄柵則對應於著名的課本範例;而課堂教材中欄數超過十的情況相當少見。在三欄下,標準範例 WEAREDISCOVEREDFLEEATONCE 會變成 WECRLTEERDSOEEFEAOCAIVDEN,這是所有練習中最常見的健全性檢查。若您收到的密文能在其中一個小欄數下乾淨地解出有意義的英文,那麼發送者幾乎可以確定就是使用該欄數。
當欄數大於或等於訊息本身的字元數時,每個使用到的位置都會落在各自獨立的初始下行階段,因此輸出結果會與輸入相同。這個邊界情況可作為快速檢查工具是否逐字讀取輸入的依據,同時也說明了為什麼極短的訊息本身無法透露欄數資訊。與已知範例(例如上面的三欄範例)進行比對,比盲目猜測更快,也無需修改訊息內容。
以三欄為例的實作演練
以課本中的明文 WEAREDISCOVEREDFLEEATONCE 為例——共二十五個字母,沒有空格。在三欄的情況下,鋸齒圖樣會以 0, 1, 2, 1, 0, 1, 2, 1 的重複順序走訪各列,週期長度為 4。將每個字母寫到其所屬的列上,結果如下:
- 第 0 列:W, E, C, R, L, T, E
- 第 1 列:E, R, D, S, O, E, E, F, E, A, O, C
- 第 2 列:A, I, V, D, E, N
由左至右讀取第 0 列可得 WECRLTE,讀取第 1 列可得 ERDSOEEFEAOC,讀取第 2 列可得 AIVDEN。將三列串接起來就得到密文 WECRLTEERDSOEEFEAOCAIVDEN,與標準參考範例一致。要將其反轉,請計算每列所屬的位置數(分別為 7、12、6),將密文切分成大小完全相符的三個區塊,然後依原始的 0, 1, 2, 1, 0, 1, 2, 1 順序走訪,每一步從對應的區塊中取出一個字元。結果即為原始明文 WEAREDISCOVEREDFLEEATONCE。
這個範例正是本頁面的「黃金範例 (golden fixtures)」之一,這代表頁面會以此預期密文檢查加密結果,同時也能解密回完全相同的原文,因此這是在處理更長或更模糊的訊息之前,確認欄數與慣例一致的最快方法。
為什麼 Rail Fence 並非真正的加密
Rail Fence 除了欄數之外沒有其他秘密,而欄數是一個很小的整數,攻擊者可以非常快速地嘗試完畢。它保留了原始的字元頻率,因此對密文進行的簡易頻率分析看起來會與對明文進行的結果完全相同。它沒有身分驗證、沒有金鑰衍生機制,也無法防止竄改。基於這些原因,Rail Fence 密碼解碼器僅應用於學習、解謎、課堂練習以及 CTF 練習。
若需要對憑證、權杖、檔案或私人訊息提供真正的機密性保護,請使用經過審查並具身分驗證的加密機制(例如 AES-256-GCM),而非古典的換位密碼。獨立的 AES 工具可將演算法封裝成可攜的密碼保護套件;而 Rail Fence 無法提供任何類似的保障。請將每次 Rail Fence 往返視為慣例的證據,而非安全性的證明,並記得歷史上的換位密碼僅作為教學工具存在,而非用於保護敏感性資料。
若您的練習需要保留空格(例如原始訊息包含標點或多字詞片語時),如何在不遺失空格的情況下解碼 Rail Fence 密碼這份專屬指南會更詳細地說明相關慣例,並逐步示範包含大量空白的範例。
延伸閱讀:ROT 密碼解碼器:線上反轉 ROT13 文字。