Vigenere 密碼是一種重複金鑰的多字母替代加密,它會將訊息的每個字母加上當前金鑰字母的位移值來對應到一個新字母,位移超過 26 時會循環繞回,解密則以相同的金鑰反向進行。每個 ASCII 字母 A 到 Z 都被視為 0 到 25 之間的數字,每個小寫字母 a 到 z 也以相同方式處理,而金鑰是一個由 A–Z 字母組成的短詞,會重複延伸以涵蓋整個訊息。加密公式為 (訊息字母 + 金鑰位移) mod 26;解密則為 (訊息字母 − 金鑰位移 + 26) mod 26。其結果是由金鑰挑選的一系列 Caesar 位移,這也是為什麼使用單字母金鑰的 Vigenere 其實只是換了名字的 Caesar 密碼。由於金鑰很短且會重複,這種密碼是密碼學課程和解謎活動中的經典教材,但這個特性也正是它不適合用來保護真實秘密的原因。

對於已經持有金鑰並想立即取得結果的讀者,Vigenere Cipher Decoder 可以在瀏覽器中執行相同的公式,無需上傳也無需帳號。本文其餘部分將逐步說明運算過程、工具內部的步驟、一個實際範例,以及工具所採用的慣例,以確保輸出結果與其他參與者所預期的結果一致。

how to encrypt and decrypt vigenere cipher
how to encrypt and decrypt vigenere cipher

Vigenere 密碼如何轉換字母

Vigenere 最容易理解為由金鑰選擇的一系列 Caesar 位移。單一 Caesar 位移會將每個字母移動固定的距離;Vigenere 金鑰則為金鑰中的每個位置選擇不同的位移,然後在訊息進行時循環使用這些位移。

字母表的編號方式是 A 為 0,B 為 1,C 為 2,以此類推到 Z 為 25。金鑰遵循相同的編號方式,因此金鑰字 LEMON 讀作 11, 4, 12, 14, 13。對於訊息中的每個 ASCII 字母,工具會取得該字母的數值,加上(加密時)或減去(解密時)當前金鑰字母的數值,將結果取模數 26,再對應回字母。如果金鑰在訊息結束前就用完了,會從第一個字母重新開始。

模式每個字母的公式金鑰推進方式
加密(訊息 + 金鑰位移) mod 26每個 ASCII 字母前進一步
解密(訊息 − 金鑰位移 + 26) mod 26每個 ASCII 字母前進一步
跳過字元原樣複製不消耗步數

保留來源字母的大小寫:大寫輸入字母一定會產生相同形式的大寫輸出字母,小寫輸入字母一定會產生小寫輸出字母。金鑰會在內部進行標準化,因此 LEMON、lemon 和 Lemon 對工具而言都是同一組金鑰。

在瀏覽器中加密和解密訊息

一旦取得金鑰,實際的轉換只需要幾次點擊。工具將輸入框、金鑰框、模式選擇器和標示清楚的結果都放在同一個畫面上,方便確認哪組金鑰對應到哪個輸出。

  1. 將明文貼入文字框以進行加密,或將密文貼入同一個文字框以進行解密。可接受的長度上限為 500,000 個 UTF-16 程式碼單位,這與 JavaScript 對該字串所回報的長度相同。
  2. 金鑰只能使用 ASCII 字母 A 到 Z,不可包含空格、數字、標點符號或重音符號。大小寫混合皆可;金鑰長度最多 256 個字母,空白或無效的金鑰會被拒絕,且不會產生任何部分輸出。
  3. 根據需要選擇加密或解密。加密會將文字框視為明文;解密會將文字框視為密文。
  4. 執行轉換並讀取標示清楚的結果。使用複製按鈕即可將密文或明文直接複製到剪貼簿,無需重新輸入。
  5. 將確切的金鑰連同訊息一起記錄。以相反方向使用相同的金鑰是讓夥伴能還原原始文字的唯一可靠方式;金鑰的原始大小寫對工具而言並不重要,即使夥伴的程式是區分大小寫的也沒關係。

編輯文字、金鑰或模式會立即清除先前的結果和任何錯誤訊息,因此舊的密文不會與新的金鑰並存。清除功能會一併移除文字、金鑰、輸出和錯誤。如果輸入超過 500,000 個程式碼單位的上限,工具會以明確的訊息拒絕整個輸入,而不是悄悄地截斷它。

實際範例:以 LEMON 為金鑰處理 ATTACKATDAWN

訊息 ATTACKATDAWN 搭配金鑰 LEMON 是教科書中的標準案例,同時也是工具內部黃金測試之一。親手演算一遍就能清楚看出工具做了什麼,這是在依賴工具解謎之前快速建立信心的好方法。

為字母編號:A=0, T=19, T=19, A=0, C=2, K=10, A=0, T=19, D=3, A=0, W=22, N=13。金鑰編號:L=11, E=4, M=12, O=14, N=13,並重複延伸以對齊 L-E-M-O-N-L-E-M-O-N-L-E。將每對數值相加後取模數 26:

  • A (0) + L (11) = 11 → L
  • T (19) + E (4) = 23 → X
  • T (19) + M (12) = 31 mod 26 = 5 → F
  • A (0) + O (14) = 14 → O
  • C (2) + N (13) = 15 → P
  • K (10) + L (11) = 21 → V
  • A (0) + E (4) = 4 → E
  • T (19) + M (12) = 31 mod 26 = 5 → F
  • D (3) + O (14) = 17 → R
  • A (0) + N (13) = 13 → N
  • W (22) + L (11) = 33 mod 26 = 7 → H
  • N (13) + E (4) = 17 → R

密文為 LXFOPVEFRNHR。將該字串與相同的金鑰 LEMON 一起貼入工具並選擇解密,即會反轉整個運算:對每個字母執行 (密文 − 位移 + 26) mod 26,金鑰在每個 ASCII 字母上向前推進一步。還原後的文字為 ATTACKATDAWN,這證明了兩個操作互為精確的反函式。任何一對明文與金鑰只要在 Vigenere Cipher Decoder 中經過兩種模式往返處理,都能逐位元組重現原始內容,因為兩個方向的驗證、對齊和大小寫處理方式完全相同。

非字母字元對金鑰索引的影響

手寫 Vigenere 時最常出錯的原因之一,就是與接收方對於空格和標點符號是否推進金鑰的認知不同。工具選擇單一規則並加以鎖定:只有 ASCII 字母 A–Z 和 a–z 會消耗金鑰位置。其他所有程式碼單位都原樣複製,下一個 ASCII 字母會使用下一個位移。

根據這條規則,金鑰會像一條膠帶一樣置於字母下方。字母就像是瓷磚;間隙則是空格、數字、標點符號、換行、重音字元、表情符號和 CJK 程式碼點。膠帶只在有瓷磰的地方才會前進。將金鑰 LEMON 套用於 A!B?C 時,L 對應 A,E 對應 B,M 對應 C;驚嘆號和問號都不會消耗位置。這個慣例已在工具中明定並通過測試驗證,因此相同的輸入、金鑰和模式一定會產生相同的輸出。

單一補充表情符號是個有用的邊界案例。表情符號佔用兩個 UTF-16 程式碼單位但不是 ASCII 字母,因此兩個程式碼單位都會原樣複製,金鑰索引不會推進。這個細節對 500,000 程式碼單位的上限很重要:一則充滿表情符號的長訊息會比可見字元數相同但沒有表情符號的訊息更早被拒絕,而這正是工具所公告的可預期行為。

輸入限制、拒絕情況與應對方式

工具有兩項硬性限制和一組會產生明確錯誤而非部分輸出的驗證規則。事先了解這些規則可以避免在長時間轉換時遇到意外狀況。

  • 文字長度:500,000 個 UTF-16 程式碼單位。計數方式與 JavaScript 的字串長度一致,因此每個 BMP 程式碼單位計一次,每個補充程式碼點計兩次。達到上限的文字會被完整轉換;超過上限的文字會被整體拒絕。
  • 金鑰長度:256 個 ASCII 字母。超過此長度的金鑰無效,且不會產生任何結果。空白金鑰因相同原因也視為無效。
  • 金鑰內容:僅限 A–Z 或 a–z。即使訊息中允許使用空格、數字、標點符號、重音和符號,這些字元都不允許出現在金鑰中。
  • 編輯行為:變更文字、金鑰或模式會清除先前的輸出和任何錯誤訊息,因此過時的密文不會被誤認為是新的結果。

對於想要與單一位移密碼進行公平比較的讀者,Caesar Cipher Decoder 套用的是單一固定位移而非重複金鑰,並使用相同的大小寫保留和非字母直通慣例。該工具是一個有用的健全性檢查:如果長度為 1 的金鑰表現得如同相同數值的 Caesar 位移,則表示 Vigenere 的設定連接正確。

Vigenere 的適用範圍與不適用之處

Vigenere 是個絕佳的教學工具。它展示模組運算,呈現如何將一串弱密碼組合成看似不規則的東西,並產生未受訓練者無法讀懂的密文。它經常出現在密室逃脫的線索、課堂練習、地理藏寶提示和休閒解謎活動中,而相同的模式也出現在密碼分析的入門教材中,因為重複的金鑰會洩漏可被頻率分析和金鑰長度估算工具攻擊的結構。

它並非安全工具。重複的金鑰很短,因此這種密碼容易遭受古典攻擊,而現代電腦可以快速測試可能的金鑰。工具本身並不會嘗試尋找金鑰、評估可能的明文或執行字典搜尋;它需要第一次就提供正確的金鑰。對於密碼、驗證 token、財務細節、個人紀錄,或任何洩漏會造成影響的資料,正確的選擇是採用經過維護的現代加密系統,具備認證加密和妥善的金鑰管理,例如本網站的 AES Encryption Online 工具。Vigenere 屬於教室和解謎書,而非憑證保管庫。

分享 Vigenere 謎題時,也要一併分享精確的對齊慣例。兩個在字母表上達成共識的程式,仍可能對於空格是否消耗金鑰位置持不同看法,而這個分歧會在第一個不一致點之後悄悄打亂每個字母。本工具所採用的慣例正是本文所述:只有 ASCII 字母會推進金鑰,其他所有程式碼單位都原樣通過,並保留來源字母的大小寫。在兩端都使用本工具的人會看到一致的輸出,這正是事先鎖定規則並清楚說明的全部意義。

如需更深入的說明,請參閱 XOR Cipher Calculator: Encrypt and Decrypt Text Online

如需更深入的說明,請參閱 Caesar Cipher Decoder and Encoder for Shifts 0 Through 25