使用已知金鑰長度解密維吉尼亞密碼(Vigenere cipher),代表將密文的每個字母依據您重複使用的 A–Z 金鑰中對應的位移進行反推,對每個 ASCII 字母套用公式(密文 − 金鑰 + 26)mod 26,而空格、標點符號、數字、表情符號以及帶有腔調的字元則原封不動地保留。金鑰長度就是您金鑰中的字母數量,當 Vigenere Cipher Decoder 用完金鑰字母後,會從頭開始重複該金鑰繼續套用,且僅與訊息的 ASCII 字母對齊,而非對應每一個字元位置。由於字母表能乾淨地從 Z 循環回 A,因此解密正是加密的完全反運算,只要您提供的金鑰與加密時所用的金鑰相符,就能還原出原始明文。如果您手上有金鑰卻從未計算過它的長度,只需直接計算該字串中的 ASCII 字母數即可。本文將逐步說明金鑰長度實際控制了什麼、如何在瀏覽器中執行解密、金鑰如何逐字元地透過密文重複套用,以及哪些輸入規則會導致解密無法執行。

金鑰長度在維吉尼亞解密中實際控制了什麼
在經典的維吉尼亞轉換中,金鑰長度決定了密碼在重複之前會循環套用多少種不同的位移。像 CAT 這種三個字母的金鑰僅使用三種位移(每個 ASCII 字母對應一種),當第四個訊息字母到來時,就會循環回到 C。而像 ORANGESQUEAM 這種十二個字母的金鑰則使用十二種不同的位移,賦予訊息更長的循環週期,使得任何規律都要更久才會重複出現。解密步驟本身並不在意您選擇了哪個長度;它僅依序走訪密文,對每個位移套用其反運算,直到走完整段訊息為止。
金鑰長度真正改變的是重複序列的週期,以及為了讓明文正確輸出您必須保持正確的字母數量。金鑰中任何位置出現一個錯誤的字母,就會在該位置產生一個錯誤的明文字母,而且由於金鑰會重複,這一個打錯的字可能會像骨牌般影響到訊息後半段。因此,在將金鑰貼入工具之前先計算其長度,是確認您沒有漏字、沒有重複字母、或是不小心把空格、數字、腔調字元混進去最快的做法。Vigenere Cipher Decoder 接受一至 256 個字母的金鑰,且將其視為不區分大小寫,因此 lemon、Lemon 與 LEMON 會產生完全相同的位移。
使用已知金鑰長度執行解密
從密文到明文最快的途徑,就是直接使用您已知的金鑰長度,在 Vigenere Cipher Decoder 中進行解密。該工具會對每個字母執行模運算,自動重複您的金鑰,並讓所有非字母字元保持在原位。
- 開啟 Vigenere Cipher Decoder,並找到您要反推的訊息輸入區。
- 將您的密文貼入訊息方塊中。任何最多 500,000 個 UTF-16 程式碼單位(code unit)的內容會被視為整體接受;超過此長度的文字將被拒絕,不會產生部分輸出。
- 在金鑰欄位中輸入已知的金鑰。金鑰只能包含 ASCII 字母 A–Z 或 a–z,不得為空,且長度必須等於或小於 256 個字母。
- 選取 Decrypt 模式,讓工具執行金鑰位移的減法而非加法。
- 執行轉換並讀取標示好的明文結果。Copy 按鈕可讓您取得完全相同的字串,以便貼入文件或聊天視窗中。
- 將金鑰與明文一同儲存,以便日後重新解密同一段密文,或將謎題分享給其他人。
如果結果看起來像胡言亂語,最常見的原因是金鑰中有一個字母打錯。請重新檢查大小寫、查看是否有字母順序顛倒的情形,並確認您計算出的金鑰長度與您輸入的一致。
重複金鑰如何與密文對齊
對齊是將金鑰長度轉化為乾淨解密或一團雜訊的實際關鍵。在 Vigenere Cipher Decoder 中,只有 ASCII 字母會消耗一個金鑰字母。兩個單字之間的空格、逗號、數字、表情符號、帶腔調的字母、換行符號或 CJK 表意文字,全都會原封不動地通過,且不會推進金鑰索引。下一個 ASCII 字母會使用循環中的下一個位移,這正是介面所陳述的,也是測試套件所嚴格鎖定的行為。
一個廣為人知的例子能讓這點更具體。明文 ATTACKATDAWN 使用金鑰 LEMON(長度為 5)加密後,會產生密文 LXFOPVEFRNHR。若要解密,請從每個密文字母中減去對應的金鑰位移,並使用公式(密文 − 金鑰 + 26)mod 26 在字母表中進行循環:
| 密文字母 | 數值(0–25) | 金鑰字母 | 位移(0–25) | 運算過程 | 明文字母 |
|---|---|---|---|---|---|
| L | 11 | L | 11 | (11 − 11 + 26) mod 26 = 0 | A |
| X | 23 | E | 4 | (23 − 4) mod 26 = 19 | T |
| F | 5 | M | 12 | (5 − 12 + 26) mod 26 = 19 | T |
| O | 14 | O | 14 | (14 − 14) mod 26 = 0 | A |
| P | 15 | N | 13 | (15 − 13) mod 26 = 2 | C |
| K | 10 | L | 11 | (10 − 11 + 26) mod 26 = 25 | K |
| E | 4 | E | 4 | (4 − 4) mod 26 = 0 | A |
| F | 5 | M | 12 | (5 − 12 + 26) mod 26 = 19 | T |
| R | 17 | O | 14 | (17 − 14) mod 26 = 3 | D |
| N | 13 | N | 13 | (13 − 13) mod 26 = 0 | A |
| H | 7 | L | 11 | (7 − 11 + 26) mod 26 = 22 | W |
| R | 17 | E | 4 | (17 − 4) mod 26 = 13 | N |
長度為 5 的金鑰控制了 LEMON 中每個字母重新出現的時機:第六個 ASCII 字母再次使用 L,第七個使用 E,依此類推。由於此範例中沒有空格或標點符號,金鑰會在每個位置上前進;若您插入空格讀成 ATTACK AT DAWN,這些空格並不會消耗金鑰字母,其對齊方式仍會與底層字母匹配。其他工具以及部分線上教學會在每個字元(含空格)上都推進金鑰,因此同一把金鑰在不同的程式上可能會產生不同的密文。維吉尼亞金鑰對齊指南更詳細地說明了這項慣例。
有效的金鑰、輸入限制,以及會阻止解密執行的情況
Vigenere Cipher Decoder 套用嚴格的檢查,因為維吉尼亞密碼本身無法單從輸出判斷金鑰是否錯誤。提前了解相關限制,能省去解密失敗後再來回嘗試的麻煩。
| 限制項目 | 數值 | 在邊界上的行為 |
|---|---|---|
| 輸入訊息大小 | 500,000 個 UTF-16 程式碼單位 | 整體接受;只要多出一個程式碼單位即會被拒絕,且不產生部分解密結果。 |
| 金鑰長度 | 1 至 256 個 ASCII 字母 | 空金鑰、過長的金鑰,或含有非字母字元的金鑰會產生錯誤且無輸出。 |
| 金鑰字元集 | 僅限 A–Z 或 a–z | 空格、數字、腔調字元、標點符號、表情符號以及符號都會被拒絕。 |
| 金鑰大小寫 | 不區分大小寫 | lemon、Lemon 與 LEMON 會產生完全相同的位移。 |
| 非字母字元處理 | 原封不動地複製 | 空格、數字、標點符號與表情符號不會推進金鑰索引。 |
| 輸出的大小寫 | 與來源一致 | 大寫輸入保持大寫;小寫輸入保持小寫。 |
| 輸入編輯 | 清除先前的輸出 | 變更文字、金鑰或模式會在重新執行前移除先前的結果。 |
輸入限制以 UTF-16 程式碼單位計算,因為這正是 JavaScript 計算字串長度的方式,能提供可預期的瀏覽器記憶體防護。像是 🙂 這種輔助表情符號會計為兩個程式碼單位,但會保持在原位而不消耗任何金鑰字母,因此表情符號不會改變您的金鑰對齊。Cornell 大學的密碼學大學部作業在其維吉尼亞問題上也採用了相同的模運算方法,這也是這些邊界選擇與標準教科書處理方式一致的原因之一。
為何已知的金鑰長度並非安全性保證
已知的金鑰長度能讓您正確地解密自己的密文,這也正是此工具在解謎、課堂練習、密室逃脫以及展示模運算時的全部用途。但它並不能讓維吉尼亞密碼在其他情境下變得安全。重複金鑰密碼會洩漏統計結構,而現代電腦可以透過 Kasiski 檢定法或重合指數(index of coincidence)來估計金鑰長度,再透過頻率分析逐字還原出金鑰。請勿使用本工具來保護密碼、認證權杖、財務細節、個人紀錄、機密訊息,或任何一旦洩漏就會造成影響的資料;歷史紀錄已經清楚表明,該密碼是可以被破解的。若需要真正的機密性,請使用具備認證加密與完善金鑰管理的現代加密系統,並將 Vigenere Cipher Decoder 留在它所屬的解謎與教學用途上。
如果您正在權衡各種選項,A1Z26 密碼:空格與斜線如何分隔數字對此有詳細說明。