要解碼 Vigenere 密碼,需將每個密鑰字母的位移從對應的密文字母中減去(模 26 計算),並使用一個會在用盡字母後從開頭重複循環的密鑰——只有 ASCII 字母 A 到 Z(及其小寫對應字母)實際參與轉換過程。Vigenere Cipher Decoder 正是在您的瀏覽器中執行這個動作:您貼上密文、提供僅由 ASCII 字母組成的已知循環密鑰、選擇解密,然後工具會反轉每個位移,同時完整保留空格、換行、數字、標點符號、表情符號、帶重音字母以及 CJK 字元的原始位置。重要的是,這是解碼,而非密鑰還原:此工具無法為您找到密鑰、估算其長度、執行頻率分析,或評估候選明文的可讀性,因此錯誤的密鑰仍會產生一個確定但毫無意義的結果。所有運算都在目前分頁中本地完成——不會上傳任何文字、密鑰或輸出結果,也無需註冊帳號。工具所遵循的慣例已鎖定在其測試中:只有 ASCII 字母會消耗密鑰位置,其他所有 UTF-16 程式碼單元都原封不動地複製,輸出之所以標記為明文,僅是因為選擇了解密模式,而非因為結果已被驗證為有意義。當交換 Vigenere 謎題時,請務必保留精確的密鑰與對齊慣例,因為其他程式可能會在空格上推進密鑰,或以不同方式正規化字元。

Vigenere 密碼解碼背後的數學原理
解碼一個 Vigenere 密碼就是加密的反向操作。加密時將目前密鑰字母的位移加到訊息中的每個 ASCII 字母上,其中 A 視為 0、B 視為 1,以此類推到 Z 為 25,然後將結果以模 26 計算後取其值:(letter + keyShift) mod 26。解碼則執行相反的操作,減去該位移並重新加上 26 以保持算術結果為正:(letter − keyShift + 26) mod 26。由於該密碼是多字母替換式——訊息中不同位置的字母可能被位移不同的量——同一個明文字母會根據其所處位置而呈現為不同的密文字母。循環密鑰會產生週期性的位移模式,一旦訊息中參與的字母數超過密鑰長度,密鑰就會從首字母重新開始。
Vigenere Cipher Decoder 正是以完全相同的算術在您的瀏覽器中實作。訊息與密鑰都會被化簡為 ASCII 字母 A–Z(密鑰端不區分大小寫,訊息端則保留原始大小寫),因此每個參與的字母都會從目前位置的密鑰字母取得其位移,且索引僅對這些參與的字母遞進。標點符號、數字、空格、換行、表情符號、帶重音字母以及 CJK 程式碼單元都會逐位元組至字串地複製,且不會推進密鑰。這項慣例刻意由測試鎖定,使用者無需猜測間距變更會如何影響對齊,以下將透過一個具體範例來說明其運作機制。
取密文 LXFOPVEFRNHR 搭配密鑰 LEMON。將字母對應為數字:L→11、X→23、F→5、O→14、P→15、V→21、E→4、F→5、R→17、N→13、H→7、R→17。對應密鑰位移:L=11、E=4、M=12、O=14、N=13,然後重複。逐位相減:11−11=0(A)、23−4=19(T)、5−12=−7+26=19(T)、14−14=0(A)、15−13=2(C)、21−11=10(K)、4−4=0(A)、5−12=19(T)、17−14=3(D)、13−13=0(A)、7−11=−4+26=22(W)、17−4=13(N)。還原後的明文為 ATTACKATDAWN。若密鑰是單一字母重複而非五個字母,密碼將退化成固定位移——這正是 Caesar Cipher Decoder 所處理的情況,建議教學時以及驗證重複單一字母密鑰的結果時,可與 Vigenere 工具一併開啟使用。
使用 Vigenere Cipher Decoder 解碼一個 Vigenere 密碼
請在瀏覽器分頁中開啟 Vigenere Cipher Decoder。按照以下步驟反轉已知的 Vigenere 密文:
- 將密文貼到輸入框中,保留原始大小寫、空格、換行、數字與標點符號。最多接受 500,000 個 JavaScript UTF-16 程式碼單元;超出此上限的內容會以整體方式被拒絕,並顯示明確訊息,而非僅處理部分前綴內容。
- 僅使用 ASCII 字母 A 到 Z 輸入循環密鑰——不含空格、數字、標點符號或重音字母。密鑰不區分大小寫,因此 LEMON、Lemon 與 lemon 都會產生相同的位移。密鑰長度必須介於 1 到 256 個字母之間;空白的或無效的密鑰會直接回傳錯誤,不會產生部分結果。
- 從模式控制項中選擇 Decrypt(解密)。當選擇 Decrypt 時,工具會將輸出標記為明文,但此標籤僅描述所要求的轉換,並非驗證其結果是否有意義。
- 執行轉換。工具會逐一掃描輸入,對每個 ASCII 字母套用 (letter − keyShift + 26) mod 26,僅對 ASCII 字母推進密鑰索引,並將其他所有程式碼單元原封不動地複製。
- 使用 Copy 按鈕複製標記為明文的結果,並將精確的密鑰一併儲存。若您之後編輯文字、密鑰或模式,先前的輸出與任何錯誤訊息都會被清除,避免將過時的明文誤認為目前的結果。
解密過程中密鑰對齊的運作方式
解密期間每個字元的行為都是固定且經過測試的。下表摘要說明常見字元類別的處理方式,以及它們是否會消耗一個密鑰位置。
| 字元類別 | 範例 | 是否推進密鑰索引? | 解密期間的處理方式 |
|---|---|---|---|
| ASCII 大寫 A–Z | T | 是 | 將目前密鑰位移以模 26 計算後減去;保留大小寫 |
| ASCII 小寫 a–z | t | 是 | 將目前密鑰位移以模 26 計算後減去;保留大小寫 |
| 空格 | (單一空格) | 否 | 原樣複製 |
| 換行 | \n | 否 | 原樣複製 |
| 數字 | 7 | 否 | 原樣複製 |
| ASCII 標點符號 | , . ! ? | 否 | 原樣複製 |
| 表情符號 | 🔑 | 否 | 原樣複製;計入 UTF-16 限制(通常為 2 個程式碼單元) |
| 帶重音字母 | é ñ ü | 否 | 原樣複製;絕不進行轉換 |
| CJK 字元 | 字 鍵 | 否 | 原樣複製 |
由此對齊方式可推導出三項結論。第一,任何字母所對應的密鑰索引僅由先前出現過的 ASCII 字母數量決定,因此兩個僅因插入空格而有所差異的密文,在使用相同密鑰時會產生相同的明文。第二,表情符號與 CJK 字元雖然不會被轉換,但仍會計入 500,000 個 UTF-16 程式碼單元的輸入預算中,因為 JavaScript 正是以這種方式計算字串長度。第三,使用相同密鑰進行解密是使用該密鑰進行加密的反向操作,因此任何您能加密再解密的文字都能完全等價往返——但僅限於本工具鎖定的慣例下成立。其他程式可能會在空格上推進密鑰、折疊帶重音字母,或採取不同的正規化方式,因此同一份密文在不同的慣例下可能會解密出不同的明文。
影響成功解碼的輸入與限制條件
此解碼器強制實施四項硬性限制。任何違反限制的輸入都會產生明確訊息,且不會產生部分輸出。
- 輸入長度:輸入最多只能有 500,000 個 JavaScript UTF-16 程式碼單元。長度恰好等於上限的文字會被完整轉換;超出上限的文字則以整體方式被拒絕。計數器衡量的是程式碼單元而非字元數,因此表情符號等輔助平面的符號通常會佔用兩個單元。
- 密鑰長度:密鑰長度必須介於 1 到 256 個 ASCII 字母 A–Z 之間。長度為 257 個字母的密鑰會直接被拒絕。
- 密鑰組成:密鑰僅能包含 ASCII 字母 A–Z 或 a–z。空格、數字、標點符號、重音字母、表情符號及符號都會使密鑰失效。密鑰在內部會被正規化為大寫,因此大小寫差異不會影響結果。
- 模式與可逆性:執行前請先選擇 Encrypt 或 Decrypt。Decrypt 模式需要正確的密鑰——並無針對錯誤密鑰的警告或偵測機制,僅會產生確定性的輸出。執行後若編輯文字、密鑰或模式,先前的輸出與任何錯誤訊息都會被清除,以避免舊的明文或密文殘留顯示。
Vigenere 解碼的適用情境與不適用情境
Vigenere 是源自 16 世紀的多字母替換式密碼,至今仍是極具價值的教學素材與謎題格式。循環密鑰方法記載於古典密碼學教育資料中,包括 CrypTool 教學簡報,它以學生能夠手動計算的方式展示了模運算、密鑰週期性,以及單字母替換與多字母替換之間的差異。常見的正當用途包括課堂練習、密室逃脫謎題、地理尋寶活動(geocaching)謎題書、休閒 CTF 競賽,以及用於示範古典密碼為何在現代密碼分析下並不安全。
然而,此工具並不適合用來保護任何敏感資料。循環密鑰會洩漏統計結構,而現代電腦能在數秒內估算密鑰長度、評估候選密鑰,並從 Vigenere 密文中還原出明文。請勿使用 Vigenere Cipher Decoder 或任何自製的 Vigenere 實作來保護密碼、身份驗證權杖、財務細節、個人紀錄、機密訊息或生產環境的秘密資料。對於任何真正的安全需求,請使用具備認證加密功能且妥善管理密鑰的現代加密系統——例如 AES-GCM,並為每則訊息使用獨一無二的密鑰。Vigenere Cipher Decoder 同時也並非解題工具:它不會嘗試字典式密鑰、不會估算密鑰長度、不會評估明文的合理性,也不會在所提供的密鑰錯誤時宣稱輸出結果是有意義的。若密鑰錯誤,輸出只是一個帶有「明文」標籤的確定性無意義結果——這是一個有用的提醒:使用正確密鑰進行解碼,與在沒有密鑰的情況下嘗試解密,是完全不同的兩回事。
如需更深入的探討,請參閱 XOR 加密是否安全?循環密鑰的現實檢驗。
如需更深入的探討,請參閱 A1Z26 密碼翻譯:實用往返指南。