在資安學習或簡易加密需求中,古典密碼學提供了極佳的教學素材。本文介紹兩種經典加密演算法——摩斯密碼與柵欄密碼,並展示如何在 Java 中實作三層加密:雙層柵欄加密後接摩斯密碼,構建一個簡易但具備多層防護的加密體系。
摩斯密碼將字元對應為「點(.)」與「劃(-)」的組合,是早期電報通訊的核心編碼方式。其特點是編碼表固定、可視性強,適合教學示範。

核心邏輯:建立字元與摩斯編碼的映射表,加密時逐字元查表替換,字元間用分隔符(如 `/`)區隔;解密時反向查表還原。
柵欄密碼屬於置換密碼,將明文按固定間隔分組(如奇偶位置分為兩組),再將各組字元依序拼接形成密文。例如明文 ASDFGHJKL 分為兩組:ADGJL(奇數位)與 SFHK(偶數位),合併後得 ADGJLSFHK。
特點:實作簡單、可逆,但安全性較低,通常作為多層加密的一環。
本方案採用 柵欄 → 柵欄 → 摩斯 三層疊加:
解密順序相反:摩斯解碼 → 柵欄解密 → 柵欄解密。
public class Fence {
// 加密:奇偶位置分組拼接
public String encryption(String password) {
StringBuilder p1 = new StringBuilder(), p2 = new StringBuilder();
for (int i = 0; i < password.length(); i++) {
if (i % 2 == 0) p1.append(password.charAt(i));
else p2.append(password.charAt(i));
}
return p1.append(p2).toString();
}
// 解密:將密文對半分割,交織還原
public String decode(String fencePassword) {
int len = fencePassword.length();
int half = len / 2;
String p1 = fencePassword.substring(0, half);
String p2 = fencePassword.substring(half);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < half; i++) {
sb.append(p1.charAt(i));
if (i < p2.length()) sb.append(p2.charAt(i));
}
if (len % 2 != 0) sb.append(p2.charAt(half)); // 處理奇數長度
return sb.toString();
}
}
public class Morse {
// 摩斯編碼映射表(節選)
private static final Map ENCODE_MAP = new HashMap<>();
private static final Map DECODE_MAP = new HashMap<>();
static {
ENCODE_MAP.put("A", ".-"); ENCODE_MAP.put("B", "-..."); // ... 其餘字元
ENCODE_MAP.put("0", "-----"); ENCODE_MAP.put(".", ".-.-.-"); // 數字與符號
// 反向填充 DECODE_MAP
ENCODE_MAP.forEach((k, v) -> DECODE_MAP.put(v, k));
}
private final Fence fence = new Fence();
// 整合加密:雙層柵欄 + 摩斯編碼
public String encryption(String password) {
password = fence.encryption(password); // 第一層
password = fence.encryption(password); // 第二層
StringBuilder morse = new StringBuilder();
for (char c : password.toCharArray()) {
String code = ENCODE_MAP.getOrDefault(String.valueOf(c).toUpperCase(), " ");
morse.append(code).append("/");
}
return morse.toString();
}
// 整合解密:摩斯解碼 + 雙層柵欄解密
public String decode(String morsePassword) {
StringBuilder text = new StringBuilder();
StringTokenizer st = new StringTokenizer(morsePassword, "/");
while (st.hasMoreTokens()) {
text.append(DECODE_MAP.getOrDefault(st.nextToken(), " "));
}
// 反向兩次柵欄解密
return fence.decode(fence.decode(text.toString()));
}
}
透過摩斯密碼與柵欄密碼的組合實作,我們不僅複習了字串處理、集合映射、演算法邏輯,更理解了「多層防禦」的基本思想。雖此方案不具實戰安全性,但作為資安入門與 Java 程式設計練習極為合適。