一份完整的 Vigenere cipher decoder 範例展示了模運算,將每個 ASCII 字母對應到下一個字母,使用的是重複的 A–Z 金鑰,而所有非字母字元則原封不動保留。解密是加密的反向操作:對於密文中每個參與運算的 ASCII 字母,工具會減去對應金鑰字母的位移值,並對結果取模 26,接著還原原始的字母大小寫。金鑰索引只在遇到 ASCII 字母時才前進,因此空格、數字、標點符號、表情符號以及重音字元都不會佔用金鑰位置。當金鑰長度比訊息短時,金鑰會從第一個字元重新循環。使用正確的金鑰時,解密可以還原每個 ASCII 字母的原始明文;使用錯誤的金鑰時,結果仍然會是確定性的,但產出的是無意義的文字。本文會以密碼學教學中一個廣為人知的配對,逐步說明其中的算術過程,接著示範如何在瀏覽器中使用 Vigenere Cipher Decoder 重現相同的答案。

vigenere cipher decoder example
Vigenere Cipher Decoder 範例:完整逐步演練

Vigenere 背後的模運算如何運作

重複金鑰的 Vigenere 密碼是建立在 26 個英文字母之上的簡單模運算。每個大寫 ASCII 字母會被指派一個 0 到 25 之間的數字:A 是 0,B 是 1,C 是 2,依此類推,直到 Z 對應 25。小寫字母使用相同的數值尺度,運算結果會轉換回原本的大小寫。金鑰也會被化簡為一串位移值,其中 A 貢獻 0,B 貢獻 1,Z 貢獻 25。金鑰不需要全部大寫:內部會自動統一大小寫,因此 lemon、LEMON 和 Lemon 都會產生完全相同的位移序列 11、4、12、14、13。

加密的計算方式是 (letter + keyShift) mod 26。解密的計算方式是 (letter − keyShift + 26) mod 26。解密中的「+26」是為了讓取模前的中間值保持非負數。每個 ASCII 字母恰好會消耗金鑰中的一個位移值;當金鑰長度比訊息短時,它會繞回第一個字母並繼續進行。非 ASCII A–Z 或 a–z 的字元 — 空格、換行、數字、標點符號、表情符號、重音字母、CJK 表意文字以及組合記號 — 都會原樣複製過去,不會推進金鑰。這項關於非字母字元直接通過的單一規則,是比較兩個不同 Vigenere 實作時最常見的不一致來源。

字元類型對金鑰索引的影響對輸出的影響
ASCII 字母 A–Z前進 1位移,保留大小寫
ASCII 字母 a–z前進 1位移,保留大小寫
空格、Tab、換行不變原樣複製
數字 (0–9)不變原樣複製
標點符號 (! , . ? 等)不變原樣複製
重音字母 (é, ñ, ü)不變原樣複製
補充平面的表情符號 (🎉, 🔑)不變原樣複製
CJK 表意文字 (中,日)不變原樣複製

使用 LEMON 的 Vigenere Cipher Decoder 實作範例

教學上的經典範例使用明文 ATTACKATDAWN 以及關鍵字 LEMON。兩段字串都是 ASCII 字母,因此金鑰每個字元會前進一次,不會產生對齊的疑問。關鍵字有五個字母,因此它的位移會重複以涵蓋全部十二個明文字母:L E M O N L E M O N L E,以數值表示為 11, 4, 12, 14, 13, 11, 4, 12, 14, 13, 11, 4。

要進行加密,每個明文字母會依其金鑰值向前位移,並在超過 Z 時繞回 A。第一個明文字母 A (0) 加上金鑰 L (11) 得到 11,也就是 L。第二個明文字母 T (19) 加上金鑰 E (4) 得到 23,也就是 X。第三個明文字母 T (19) 加上金鑰 M (12) 得到 31;31 mod 26 等於 5,也就是 F。以同樣方式繼續:A + O 得到 O,C + N 得到 P,K + L 得到 V,A + E 得到 E,T + M 得到 F,D + O 得到 R,A + N 得到 N,W + L 得到 H,N + E 得到 R。因此完整的密文為 LXFOPVEFRNHR。這與教科書以及 Cornell CS 1132 的古典密碼作業中出現的 ATTACKATDAWN/LEMON 配對一致。

若要在同一把金鑰下對相同的密文進行解密,工具會改為進行減法。L (11) 減去 L (11) 等於 0,也就是 A。X (23) 減去 E (4) 等於 19,也就是 T。F (5) 減去 M (12) 等於 −7;加上 26 得到 19,也就是 T。O (14) 減去 O (14) 等於 0,也就是 A。P (15) 減去 N (13) 等於 2,也就是 C。V (21) 減去 L (11) 等於 10,也就是 K。E (4) 減去 E (4) 等於 0,也就是 A。F (5) 減去 M (12) 等於 −7 加上 26 = 19,也就是 T。R (17) 減去 O (14) 等於 3,也就是 D。N (13) 減去 N (13) 等於 0,也就是 A。H (7) 減去 L (11) 等於 −4 加上 26 = 22,也就是 W。R (17) 減去 E (4) 等於 13,也就是 N。運算結果是 ATTACKATDAWN,完全還原原始明文。

如何在 Vigenere Cipher Decoder 中執行相同範例

  1. 在任何現代瀏覽器中開啟 Vigenere Cipher Decoder。無需安裝任何軟體,也無需上傳任何資料 — 這個工具完全在當下的分頁中執行。
  2. 將密文 LXFOPVEFRNHR 貼到文字輸入區。輸入上限為 500,000 個 JavaScript UTF-16 碼元,因此一個 12 個字母的範例遠在限制範圍內。
  3. 在金鑰欄位中輸入金鑰 LEMON(或 lemon)。金鑰不區分大小寫,且只能包含 ASCII 字母 A–Z,最多 256 個字母。
  4. 選擇解密 (Decrypt)模式,讓工具減去金鑰位移而非加上位移。
  5. 點擊執行按鈕。輸出會出現在標示清楚的結果區中,標籤顯示為 plaintext,反映所選的模式。
  6. 使用複製按鈕複製還原後的 ATTACKATDAWN 字串,或貼上你自己的明文,並將模式切換為加密 (Encrypt)來產生 LXFOPVEFRNHR。
  7. 如果你變更任何輸入 — 文字、金鑰或模式 — 先前的輸出以及任何錯誤訊息都會立即被清除,以免將舊結果誤認為新的轉換結果。

為何金鑰對齊規則在真實範例中很重要

非字母字元直接通過的規則,是讓一個實作的解密範例能夠跨不同程式重現的關鍵。如果密文被寫成 LXF OPV EFR NHR(帶有空格),兩個不同的 Vigenere 工具可能會給出不同的結果:其中一個可能會在空格處推進金鑰,另一個(包括本文所討論的瀏覽器工具)則會跳過它們並保持對齊。這套瀏覽器工具的行為已在其介面標籤中明確鎖定,並經過明確測試,因此金鑰索引只會在遇到 ASCII 字母時才推進。夾在兩個字母之間的標點符號不會消耗金鑰字元,而下一個 ASCII 字母會接續取用下一個金鑰位移。想要深入了解這項慣例的讀者,可以參閱在解讀 Vigenere 密文時對齊金鑰的指南。

同一條規則也適用於重音字母。像 café 這樣的訊息在解密時只會使用三個金鑰位移(對應 c、a、f),因為 é 不是 ASCII 字母,會原封不動地通過。像 🎉 這樣的補充平面表情符號佔用了兩個 JavaScript UTF-16 碼元,但同樣不會消耗金鑰字母,且會在輸出中原樣保留。這樣的可預測性在你與使用不同程式的人交流謎題或作業答案時很重要,因為不同實作之間唯一的差異通常就是非字母字元的對齊規則。

Vigenere 解密範例何時有用、何時沒有用

實作的解密範例適合用於學習多字母替換背後的模運算、完成課堂習題、解開密室逃脫的線索,或是用來驗證手算結果與已知答案是否相符。Caesar Cipher Decoder涵蓋了單一位移的特殊情況,而 Vigenere 工具則涵蓋了重複金鑰的一般化情形。兩者對於休閒謎題和密碼學示範都很有用,且都被收錄於 CrypTool 教育型展示文件中,作為古典密碼機制的教學範例。

當你沒有金鑰時,實作的解密範例就不是合適的工具。這套瀏覽器工具不會執行頻率分析、不會估算金鑰長度、不會執行字典搜尋,也不會對候選明文進行評分。如果你需要從密文還原未知的金鑰,那涉及的是密碼分析(cryptanalysis),而這套工具刻意不會嘗試這類操作。它同樣不適合用來保護真實的秘密:歷史上的 Vigenere 密碼會洩漏統計結構,而且會被現代電腦輕易破解。請勿將它用於密碼、身份驗證令牌、金融資料、個人紀錄,或任何一旦洩漏會造成影響的資訊。任何涉及安全敏感性的用途,請使用具備認證加密與完善金鑰管理的維護良好的現代加密系統。

如果你正在權衡各種選擇,如何判斷 A1Z26 Cipher Translator 是否為合適的工具對此有詳細說明。