一個使用預設金鑰 3 3; 2 5 的希爾密碼解碼器範例,會根據文件所記載的慣例,將明文 HELP 轉換成密文 HIAT,其中 A 對應到 0,B 對應到 1,依此類推直到 Z 對應到 25。每兩個字母會被分組為一個行向量,再乘以 2x2 的金鑰矩陣,並將兩個輸出結果都以 26 取模數。Hill Cipher Decoder 在你的瀏覽器中執行相同的運算,因此你可以在不安裝軟體或將文字傳送到遠端伺服器的情況下,重現 HELP 到 HIAT 的轉換。本頁會詳細逐步說明這個經典範例,接著示範當你輸入不同的內容、不同的可逆金鑰,以及奇數長度的明文時會產生什麼變化。你會清楚看到每個步驟中使用了哪些數字、解碼器會保留哪些字元、會去除哪些字元,以及為什麼兩個看似有效的金鑰在針對已知配對進行驗證時可能會有不同的表現。讀完後你應該能夠自行預測任何簡短範例的輸出,並能辨識出差異究竟是慣例問題而非工具錯誤。

如何建立一個希爾密碼解碼器範例
一個有用的希爾密碼解碼器範例,是一個完整展示的轉換過程,其中每個數值步驟都清楚可見,讓你能夠確認工具、金鑰與慣例在運算上達成共識。要具有實用性,範例必須事先聲明四件事:字母對應、向量方向、分塊大小,以及填補規則。Hill Cipher Decoder 在其頁面上明確記載這四項,使得這個解題範例能夠在不靠猜測的情況下於其他地方重現。字母對應會將 A 固定為一個數字;該工具使用 0 到 25,而部分教科書使用 1 到 26。向量方向決定了兩個字母在乘法中如何排列;該工具使用長度為二的行向量,而其他參考資料則將這對字母放在列中。分塊大小固定為二,因為金鑰是 2 乘 2,所以每個輸入都必須能夠被劃分為偶數長度的區塊。當明文長度為奇數時,填補規則會在正規化文字後附加一個 X,再進行分組。一旦這四項事實都被釐清,解題範例就具備可攜性,當結果與其他來源不一致時,便能診斷出是慣例差異而非計算錯誤。
在內部,解碼器會將字母對應到 0 到 25 的數值代碼,將它們分成兩個一組的行向量,將每個向量乘以 2 乘 2 的金鑰矩陣,並將兩個結果都以 26 取模數。對於金鑰的列配對 a b 與 c d,以及明文的配對 x y,工具會產生 a 乘以 x 加上 b 乘以 y,然後 c 乘以 x 加上 d 乘以 y,每一項都以 26 取模數。這單一規則就足以讓你用手算重現任何簡短範例,這正是教學情境中學習此密碼的整個重點。解密則是針對金鑰的模逆元(必要時再乘以行列式的模逆元),執行相同形狀的計算。完整的反向路徑本身又構成一個解題範例,而這個來回過程證明了所選金鑰確實描述了一個可逆運算。預設金鑰 3 3; 2 5 的行列式為 9,與 26 互質,因此反元素存在,整個來回過程能夠閉合。
HELP 到 HIAT 的逐步範例
- 閱讀頁面以確認慣例。Hill Cipher Decoder 將 A 對應到 0 直到 Z 對應到 25,使用兩個字母的行向量,套用 mod 26 的化簡,並在奇數長度的明文後填補單一個 X。如果你的練習採用任何其他慣例,即使運算正確,結果也不會相符。
- 輸入金鑰的兩個矩陣列,每列為四個整數,並以分號分隔。以經典範例而言,輸入 3 3; 2 5,因此金鑰為 [[3,3],[2,5]]。負數或過大的條目會被解碼器正規化為 0 到 25。
- 使用表單上的切換鈕選擇方向,加密或解密。若要重現經典範例,請選擇加密。
- 將由 A 到 Z 組成的訊息貼入文字欄位。以經典範例而言,輸入 HELP。空格、標點符號與數字會自動被移除,因此不要指望它們能保留到輸出中。
- 執行轉換並讀取大寫輸出結果。使用預設金鑰與頁面記載的慣例時,HELP 會加密為 HIAT。
- 將切換鈕切換到解密,維持同一把金鑰,並將 HIAT 貼回輸入欄位,即可反向執行此運算。解碼器應會回傳 HELP,證實這個來回過程。
步驟五的底層運算相當簡短,足以用紙筆驗算。字母代碼為 H 等於 7、E 等於 4、L 等於 11、P 等於 15。明文會被切割為 HE 作為行向量 7、4,以及 LP 作為行向量 11、15。對於 HE,公式會給出 3 乘 7 加上 3 乘 4,即 33,由於 33 mod 26 等於 7,因此得到 H;接著 2 乘 7 加上 5 乘 4,即 34,由於 34 mod 26 等於 8,因此得到 I。對於 LP,公式會給出 3 乘 11 加上 3 乘 15,即 78,由於 78 mod 26 等於 0,因此得到 A;接著 2 乘 11 加上 5 乘 15,即 97,由於 97 mod 26 等於 19,因此得到 T。依序讀取這四個輸出就得到 HIAT,與文件記載的結果一致。任何其他輸出都代表慣例不相符,而非計算錯誤,而最常見的原因是將金鑰視為列向量轉換。
Hill Cipher Decoder 的其他解題範例
經典範例只測試了一把可逆金鑰,但解碼器的設計目的是接受不只一把金鑰的測試。頁面記載了一組測試案例,分別涵蓋預設金鑰、奇數長度填補、零字母與最大字母,以及另外三把可逆金鑰。每個測試案例都會在兩個方向上進行檢查,以維持來回過程的真實性,這也是為什麼在信任較長的輸出之前,你應該先比較一組已知配對。如果你想延伸練習,請每次只更改一個變數,並在串接更多步驟之前先驗證新的來回過程。Hill Cipher Decoder 速查表:公式與預設值 以精簡形式記錄了相同的公式與預設值,方便在考試或寫作業時參考。
| 情境 | 變動之處 | 對範例的影響 |
|---|---|---|
| 不同的字母對應(A=1 對 A=0) | 每個數值代碼都偏移一個 | 每個輸出字母都會位移,使得無法與本頁直接比較 |
| 使用列向量而非行向量 | 乘法順序相反 | 相同可見的金鑰數字會產生不同的密文 |
| 較大的分塊大小,例如 3 乘 3 | 分組方式與運算改變 | HELP 不再會被切割成兩個兩個一組的區塊 |
| 奇數長度的明文 | 解碼器在分組前附加一個 X | 加密會保留填補字元,解密則會保留任何真實的結尾 X |
| 行列式與 26 共享因數 | 模逆元不存在 | 在產生任何輸出之前,金鑰就會被拒絕 |
當教科書的解答與解碼器不一致時,這張表格就是真正重要的比較依據。一旦你能辨識出是哪一列的情境在起作用,你就能調整輸入或重新詮釋教科書的解答,而不必更動工具。一次處理一列會比反覆重做整個計算來得快。
為何慣例差異會破壞希爾密碼範例
大多數希爾密碼解碼器範例的失敗,是慣例失敗而非運算失敗。兩個最常見的原因是字母對應以及向量方向。如果教科書使用 A 等於 1 到 Z 等於 26 而非 A 等於 0 到 Z 等於 25,每個數值輸出每個字母都會偏移一位,使得可見的密文看起來毫不相關,儘管底層的矩陣運算本質上是相同的。如果教科書使用列向量而非行向量,乘法的順序會改變,相同可見的金鑰數字會產生不同的密文。解碼器記載其慣例為 C 等於 K 乘以 P,其中 P 為行向量,這也是經典 HELP 到 HIAT 範例所使用的方向。任何在不知情的情況下使用不同方向的參考資料,即使兩個實作都正確,看起來也會與解碼器不一致。
分塊大小與填補規則會造成下一層的混淆。2 乘 2 的金鑰只能用於兩個字母的區塊,因此奇數長度的明文必須在分組前進行填補。解碼器只有在正規化後的明文長度為奇數時才會附加一個 X,並且不會嘗試保留原始格式,也不會猜測結尾的 X 是否為填補字元。這意味著真正以 X 結尾的訊息無法與被填補過的訊息區分開,而且解碼器不會自動刪除結尾的 X。在任何受控練習中,請記錄原始長度,以免解密步驟悄悄丟棄真實字元。如何使用 mod 26 反元素解密 2x2 希爾密碼 這份配套指南更深入地說明了反元素的計算,如果你想親手走過一輪來回過程,可以參考。
輸入大小與處理的執行位置是另外兩個影響範例的實務細節。解碼器將輸入上限設為 100,000 個字母,以保持互動的流暢度,這對作業練習來說綽綽有餘,但無法單次處理整本書。所有運算都是在瀏覽器本地端執行,因此金鑰絕不會被傳送到伺服器,但金鑰仍然是輸入到一個網頁表單中。請將這個頁面視為教學輔助工具,而非機密通訊管道。希爾密碼之所以在歷史上具有重要性,是因為它將線性代數應用於多字母替代,而它至今仍是個寶貴的教學範例,但對於現代的機密性需求而言,它並不安全。
當解碼器拒絕您的範例時
如果該金鑰在 mod 26 下沒有模逆元,解碼器就會拒絕執行。2 乘 2 金鑰的行列式必須與 26 互質,這表示它除了 1 之外不能與 26 共享任何因數。由於 26 等於 2 乘 13,行列式必須是奇數,而且不能是 13 的倍數。如果它是偶數,則反矩陣在有理數上存在,但在 mod 26 下不存在,因為任何偶數乘以任何數仍然是偶數,絕對不可能同餘於 1 mod 26。如果它是 13 的倍數,同樣的論點也排除了反矩陣的存在。偵測器會在處理任何文字之前檢查這個條件並拒絕該金鑰,因此範例會快速失敗並顯示明確的錯誤,而不是回傳一個剛好往返轉換回相同密文的誤導性明文。
解碼器也會拒絕那些無法在其記錄規則下處理的輸入。空的正規化輸入不會產生任何輸出。具有奇數個正規化字母的密文會被拒絕,因為每個區塊必須剛好包含兩個值。明文可以有奇數長度,因為加密會附加 X,但原始長度應該被記錄下來,這樣解密才不會悄悄破壞真實的訊息字元。超過 100,000 個字母的輸入會在處理前被截斷,以保持頁面的回應速度。沒有擸一個限制是被隱藏起來的,矩陣計算器也會將負數或過大的金鑰項目正規化到 0 到 25 的範圍內,因此即使是手寫的、差一錯誤金鑰項目的範例也能正常運作。當您達到計算器所能接受的限制時,正確的下一步通常是重新檢視題目說明,而不是繼續在表單中輸入。