Hill 密碼解碼器使用一個 2×2 可逆矩陣,透過 A=0 到 Z=25 的對應、雙字母行向量、為奇數明文補上 X,以及頁面所完整記錄的 C = K × P mod 26 公式,對 A–Z 文字進行加密與解密。預設金鑰 [3 3; 2 5] 會將四字母的明文 HELP 轉成密文 HIAT,這組配對是唯一值得在信任較長輸出之前先行確認的固定範例。解密時,會將每個密文行向量乘上 K 的模反元素,而模反元素僅在 gcd(det K, 26) = 1 時存在;行列式含有 2 或 13 這個因數的金鑰會被拒絕,而不會回傳誤導性的文字。負值或過大的金鑰元素會被正規化到 0–25 的範圍內,空白、標點與數字會在分組前先被去除,且密文必須含有偶數個正規化後的字母,因為每個區塊剛好帶有兩個值。明文可以是奇數長度,因為加密時會附加一個 X;但原始訊息中真實的結尾 X 一旦被正規化後,便無法與填充的 X 區分,因此在做任何受控練習時,原始長度應該事先記錄,而不是從解密結果反推。

解碼器所採用的固定慣例
每份參考資料對 Hill 密碼的描述都有些微差異。解碼器僅採用一種有完整記錄的慣例,並拒絕猜測讀者所使用的是教科書中的哪一個變體。大多數「輸出錯誤」的情況其實是慣例不一致,而非運算錯誤,所以當結果與習題或投課內容不一致時,應該先從這裡開始檢查。
| 設定 | 本頁面 | 部分教科書與工具 |
|---|---|---|
| 字母對應 | A=0 到 Z=25 | A=1 到 Z=26,或是邊界位移後的 0–25 |
| 向量方向 | 行向量 | 列向量 |
| 加密公式 | C = K × P | C = P × K,且矩陣擺放方式不同 |
| 區塊大小 | 固定為 2 個字母 | 依金鑰而定為 2 或 3 個字母 |
| 奇數長度明文的填充 | 在尾端附加一個 X | 不填充,或使用其他字母,或隨機填入 |
| 金鑰輸入方式 | 四個整數;列與列之間以分號分隔 | 逗號清單、大括號語法或 PDF 表格 |
| 解密 | K 的模反元素,僅在 gcd(det K, 26) = 1 時 | 條件相同,但被拒絕時的行為各有不同 |
若另一個來源在相同可見數字下產生不同的密文,差異幾乎一定可以追溯到上述其中一列。請重新閱讀該參考資料的範例,找出與上表不符的列,並在認定工具錯誤之前,先以手動方式重現該慣例。
mod 26 公式與預設金鑰
給定一個 2×2 金鑰 K = [[a, b], [c, d]] 以及由正規化後字母配對所構成的明文行向量 P = [x, y],Hill 密碼解碼器所使用的加密公式為:
C = K × P = [a·x + b·y, c·x + d·y],每個項目皆進行模 26 化簡。
解密時,會將每個密文行向量乘上 det(K)-1 再乘上 K 的伴隨矩陣,全部以模 26 化簡,並先驗證 gcd(det K, 26) = 1。預設金鑰 [3 3; 2 5] 是「金絲雀」配對,因為其計算過程短到可以手動驗證:
- HELP 配對為行向量 [H, E] = [7, 4] 與 [L, P] = [11, 15]。
- K × [7, 4] = [3·7 + 3·4, 2·7 + 5·4] = [21 + 12, 14 + 20] = [33, 34]。
- 33 mod 26 = 7 (H),34 mod 26 = 8 (I),得到第一對輸出 HI。
- K × [11, 15] = [3·11 + 3·15, 2·11 + 5·15] = [33 + 45, 22 + 75] = [78, 97]。
- 78 mod 26 = 0 (A),97 mod 26 = 19 (T),得到第二對輸出 AT。
- 串接起來,HELP 在本頁面所記錄的慣例下會加密為 HIAT。
若改用列向量、A=1 對應或不同的填充規則來執行相同計算,結果將不會是 HIAT。這一處不一致通常就足以判斷是哪一列慣例出了問題。
如何加密或解密一個 2×2 訊息
以下為本頁面所預期、依序進行的操作步驟。請將其視為檢查清單,以避免任何輸入欄位處於不一致狀態。
- 確認練習使用的是 A=0 到 Z=25 的對應、雙字母行向量,以及 X 填充。若其中任何一項不同,即使運算正確,結果也不會與預期答案相符。
- 在金鑰欄位中輸入四個整數作為矩陣的兩列,並以分號分隔,例如 3 3; 2 5 以符合預設值。
- 從模式控制項中選擇加密或解密,以便在適當時機使用模反元素而非正向乘法。
- 將 A–Z 訊息或密文貼上或輸入到文字欄位中。空白、標點與數字會自動移除,並在瀏覽器中進行分組。
- 執行轉換,然後在依賴較長輸出之前,先以預設金鑰比對一組已知的配對,例如 HELP 對應到 HIAT。
當解碼器拒絕您的金鑰時
2×2 金鑰只有在行列式 a·d − b·c 與 26 互質時才會被接受,亦即 gcd(det K, 26) = 1。26 的因數為 2 與 13,因此行列式為偶數或是 13 的倍數的金鑰沒有模反元素,也無法唯一地解密每一對。解碼器不會產生模稜兩可的輸出,而是會以明確的錯誤訊息拒絕這些金鑰。負數或過大的數值雖然會被接受,但會在進行行列式檢查之前先被正規化到 0–25 的範圍內。
實務上的意涵是:若本頁面拒絕了一份習題中視為有效的金鑰,則該習題所使用的慣例可能採用了不同的行列式檢查方式,或是該金鑰是以列向量形式輸入,但本頁面預期的是行向量。請重新檢查慣例,而非運算本身。關於模反元素步驟的更完整說明,請參閱 如何解密 Hill 密碼:完整範例指南。
在信任較長輸出之前,請先驗證 HELP→HIAT
四字母的 HELP 範例短到可以手動重算,又足以一次暴露出所有慣例差異。這種組合在密碼學練習中相當少見,也正是解碼器選擇公布這組配對、而非較長範例的原因。每次在新瀏覽器、新裝置或組態變更後載入本頁時,請將其作為檢查關卡。
若預設金鑰 [3 3; 2 5] 無法將 HELP 對應到 HIAT,原因幾乎一定是下列其中之一:字母對應採用 A=1 到 Z=26 而非 A=0 到 Z=25、矩陣是以行向量而非列向量形式輸入、公式被顛倒為 P × K,或是比對對象是依據不同填充規則所產生的密文。這些情況皆非瀏覽器運算錯誤。請依據其他來源所聲稱的慣例手動重新推導預期輸出,再於本頁面所記錄的慣例下重新執行解碼器,以確認兩種計算在內部邏輯上一致。
Hill 密碼解碼器值得了解的限制
輸入上限為 100,000 個字母,以維持互動的流暢度,因此非常大的語料應分批處理,而非一次貼上。密文必須含有偶數個正規化後的字母,因為每個區塊剛好容納兩個值;奇數長度的密文會被拒絕,而不會被悄悄填充。明文可以是奇數長度,因為加密時會附加一個 X,且本頁面刻意保留解密後的結尾 X,以免破壞原始訊息中真實的結尾 X。大小寫、標點、變音符號與數字皆不予保留;輸出僅會顯示正規化後的大寫 A–Z 字母,且練習預期所需的任何間距都必須另外記錄。本工具僅實作 2×2 矩陣,因此教科書練習中常見的 3×3 金鑰無法在本頁面上執行。
Hill 密碼在歷史上之所以重要,是因為它將線性代數應用於多字母替換,但對於現代機密性而言並不安全。已知明文會洩漏線性關係、字母集與區塊大小皆小,且金鑰是直接在頁面上輸入的。請勿將其用於密碼、權杖、個人資訊、檔案或正式訊息的保護。若需要真正的安全性,請使用經審核的認證加密機制,例如 AES-GCM,而僅在練習明確要求使用這種歷史密碼時,才使用 Hill 密碼解碼器。
若想進一步了解,請參閱 如何在終端機中使用 ROT13 解碼指令。