標準 Vigenere 解碼操作會對密文中每個 ASCII 字母套用重複密鑰模數減法 p = (c - k + 26) mod 26,將 A 到 Z 對應到 0 到 25 的數值,並忽略所有其他字元。解密會逐字母還原加密:對於訊息中每個位置,若該位置持有 ASCII 字母 A-Z 或 a-z,解碼器會從密文字母的數值中減去目前密鑰字母的位移 (A=0, B=1, ..., Z=25),將負數結果加上 26 拉回 0-25 的範圍,然後以來源字母原本的大小寫輸出對應的字母。當訊息中的參與字母數超過密鑰長度時,密鑰會從第一個字母重新循環:一個 5 字母的密鑰套用於 12 字母的訊息時,會依序使用位移 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2。Vigenere Cipher Decoder 完全在當前的瀏覽器分頁內執行該運算,因此你的密文與密鑰絕不會離開裝置。它預設你已經知道正確的重複密鑰;它無法自行發現、估計或猜測它。

解碼與加密的差異僅在位移的方向。加密會將密鑰字母的數值加到明文字母的數值上並模 26,因此用同一把密鑰進行的加密與解密互為數學上的反運算。這種對稱性正是讓這個密碼在取得密鑰的瞬間即可輕易還原的原因,同時也是讓瀏覽器工具能在單次掃描輸入、不需保留超出目前密鑰位置與輸出字串之外的任何中間狀態即可完成解碼的結構性特性。

decode vigenere cipher with key
在瀏覽器中使用已知密鑰解碼 Vigenere 密碼

Vigenere 解碼數學如何逐字母運作

每一步 Vigenere 解碼都有三個要素:密文字母在字母表中的數值位置 (A=0 到 Z=25)、目前密鑰字母使用相同 A=0 對應的數值位置,以及將結果拉回 26 字母範圍的模數 26。對於數值為 c 的大寫密文字母 C 與數值為 k 的密鑰字母 K,解密會計算明文數值 p = (c - k + 26) mod 26,然後將 p 對應回字母。在取模數之前先加上 26 是當 c < k 時避免結果為負數的技巧;若沒有這個步驟,像 A 搭配密鑰字母 C 時會產生 -2 而非預期的 24。

使用 LEMON 密鑰對 ATTACKATDAWN 訊息的標準完整範例說明了整個來回過程。加密逐字母產生密文 LXFOPVEFRNHR:A(0)+L(11)=L、T(19)+E(4)=23 -> X、T(19)+M(12)=31 -> 5 -> F、A(0)+O(14)=O、C(2)+N(13)=P、K(10)+L(11)=V、A(0)+E(4)=E、T(19)+M(12)=5 -> F、D(3)+O(14)=R、A(0)+N(13)=N、W(22)+L(11)=33 -> 7 -> H、N(13)+E(4)=R。解碼則還原每一步: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)=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。這個配對是古典密碼學教育中的標準參考案例之一,包含在 Cornell CS 1132 Assignment 2CrypTool 教學教材 所收集的完整範例之中。

在實際處理訊息前,有三項解碼器的慣例值得熟記:

  • 只有 ASCII 字母會推進密鑰。空格、逗號、句點、數字、重音、emoji、CJK 漢字,或任何其他非 ASCII 字母的碼位,都會原樣複製到輸出中,且不消耗任何密鑰位置。下一個 ASCII 字母會使用下一個密鑰位移。當密文中字母之間包含標點時這一點很重要,因為手動解碼若將每個字元——包括空格——都算入密鑰推進,每個介入的非字母就會造成恰好一個位置的錯位。
  • 保留來源大小寫。大寫密文字母解碼為大寫明文字母,小寫密文字母解碼為小寫明文字母,而密鑰字母本身在內部模數運算執行前會標準化為大寫。
  • 密鑰不區分大小寫。LEMON、lemon 與 Lemon 都會產生相同的位移序列 (11, 4, 12, 14, 13)。密鑰欄位僅接受字母——不接受空格、數字、標點、重音或符號——且最大長度為 256 個字母。

在瀏覽器中使用密鑰解碼 Vigenere 密碼

  1. 在瀏覽器分頁中開啟 Vigenere Cipher Decoder 工具。介面接受最多 500,000 個 UTF-16 碼位的明文進行加密,或密文進行解密。
  2. 將你的密文貼到文字欄位中。請完全按照收到的來源訊息原樣使用,保留每個空格、換行、數字、標點符號與 Unicode 字元——這些字元在解碼過程中會原封不動地通過。
  3. 將已知密鑰輸入到密鑰欄位中。僅輸入 ASCII 字母 A-Z 或 a-z(任意大小寫);解碼器會在內部將密鑰標準化為大寫,因此 "lemon"、"LEMON" 與 "Lemon" 都會產生相同的位移。
  4. 選擇 Decrypt 模式。工具會要求你明確選擇方向,使其能執行模數位移的減法而非加法。
  5. 執行轉換。解碼完全在目前的瀏覽器分頁內進行——不會送出任何網路請求,也不需要任何帳號。
  6. 使用輸出框旁的 Copy 按鈕複製標示好的結果。輸出標示為 "plaintext" 是因為你選擇了解密,但這個標籤僅描述該操作,並不保證該文字就是有意義的英文。
  7. 每當你交換謎題時,請將確切的密鑰與結果一同保留。其他 Vigenere 程式可能會在空格上推進密鑰、以不同方式標準化字元,或將非 ASCII 字母視為密鑰消耗者;即使密鑰正確,這種不一致會悄悄地產生亂碼,因此保留對齊慣例與保留密鑰本身同樣重要。

解碼器轉換了什麼、保留了什麼

解碼器只對輸入字元中的一小部分子集套用模數位移,其餘全部原樣複製。下表概述了該工具契約保證會執行的行為,讓你無需先執行程式即可預測輸出。

輸入字元對輸出的影響對密鑰索引的影響
ASCII 大寫 A-Z使用目前密鑰位移移位為另一個 A-Z 字母推進一個位置
ASCII 小寫 a-z移位為另一個 a-z 字母;保留小寫推進一個位置
空格、Tab、換行原樣複製不推進
數字 0-9原樣複製不推進
標點 (.,;:!?-'" 等)原樣複製不推進
帶重音的拉丁字母 (e, n, u)原樣複製不推進
CJK 字元、emoji、組合記號原樣複製不推進
密鑰字母 (任意大小寫)在內部標準化為大寫作為目前位移使用

這個契約會直接產生兩個結果。第一,像 "LXF OPVE FRNHR"(含空格)這樣的密文,與 "LXFOPVEFRNHR" 的解碼結果相同,因為空格不會消耗密鑰字母;兩者在 LEMON 密鑰下都會產生 "ATTACKATDAWN"。第二,介於兩個 ASCII 字母之間插入的 emoji 或帶重音的字元會出現在輸出中而不會打亂對齊——當你需要將解碼結果與一段含有殘留格式字元的複製貼上訊息進行核對時,這非常實用。

限制、錯誤與輸出的行為

解碼器對文字輸入設有 500,000 個 UTF-16 碼位的硬性上限。這個計數是 JavaScript 原生的字串長度,因此一個輔助平面 emoji 計為兩個碼位,一個基本拉丁字母計為一個——這與 JavaScript 用於記憶體的度量方式相同。剛好等於上限的文字會被完整轉換。超過上限的文字會整體被拒絕並顯示明確訊息;工具不會靜默地處理前綴部分,也不會顯示看似完整但實際局部的結果。密鑰輸入有另一個 256 個 ASCII 字母的上限,而含有空格、數字、標點、重音或符號——或為空——的密鑰會直接產生錯誤,不會輸出部分結果。

輸出管理刻意做得激進。編輯文字、密鑰或模式會立即移除先前的結果與任何先前的錯誤訊息,因此在你變更輸入後,舊的密文不會殘留在畫面上。Clear 控制項會一併移除文字、密鑰、輸出與錯誤。當你使用同一段密文逐步嘗試多個候選密鑰時,這個行為很實用:錯誤密鑰產生的過時解碼會在你輸入下個密鑰字母時立即消失,避免你誤將上一把密鑰的輸出當作這把密鑰的結果。

當選擇 Decrypt 時,輸出會標示為 "plaintext";選擇 Encrypt 時,則標示為 "ciphertext",但這個標籤描述的是你所請求的操作,而非驗證結果是否有意義。即使密鑰錯誤,工具仍會產生一個完全有效(但卻是垃圾)的明文;它無法偵測你打錯字母、調換了兩個字元,或使用了另一種密碼變體的密鑰。在將結果視為真正的訊息之前,請務必對可辨識的單字、預期的片語或已知的明文片段進行合理性檢查。

Why This Is a Decoder, Not a Cipher Breaker

The Vigenere Cipher Decoder performs exactly one job, which is converting ciphertext to plaintext when you supply the correct repeating key. It does not analyze letter frequencies, estimate the key length with Kasiski examination or the index of coincidence, score candidate plaintexts against a dictionary, brute-force the keyspace, or rank possible keys by likelihood. Decrypt mode with the wrong key still produces output, but that output is the modular subtraction of your supplied key - it is not a hint, a partial decode, or a best-guess candidate. The historical cipher is fully breakable against meaningful English plaintext using standard statistical attacks, which is precisely why the tool deliberately omits any cracking capability.

Use this tool for the things Vigenere is actually good at: teaching modular arithmetic and polyalphabetic substitution, working through classroom exercises, solving escape-room clues and recreational ciphers, decoding historical examples, and verifying your own hand calculations. Do not use it for passwords, authentication tokens, financial details, personal records, confidential messages, or any data whose disclosure matters - repeating-key Vigenere leaks statistical structure that modern computers can exploit quickly, and the browser decoder provides no authenticated encryption, no key derivation, and no integrity check. For anything security-sensitive, use a maintained modern cipher with authenticated encryption and proper key management, and keep historical ciphers in the teaching category where they belong.

Related reading: A1Z26 Cipher Decoder: Decode Numbers Into Letters.

Related reading: Base32 Decode Cheat Sheet: Alphabet, Padding, Errors.