首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 密碼加密實戰:摩斯密碼與柵欄密碼的組合應用

     編輯:Java 綜合教學

Java 密碼加密實戰:摩斯密碼與柵欄密碼的組合應用

在資安學習或簡易加密需求中,古典密碼學提供了極佳的教學素材。本文介紹兩種經典加密演算法——摩斯密碼與柵欄密碼,並展示如何在 Java 中實作三層加密:雙層柵欄加密後接摩斯密碼,構建一個簡易但具備多層防護的加密體系。

一、摩斯密碼

摩斯密碼將字元對應為「點(.)」與「劃(-)」的組合,是早期電報通訊的核心編碼方式。其特點是編碼表固定、可視性強,適合教學示範。

摩斯密碼對照表1 摩斯密碼對照表2 摩斯密碼對照表3 摩斯密碼對照表4

核心邏輯:建立字元與摩斯編碼的映射表,加密時逐字元查表替換,字元間用分隔符(如 `/`)區隔;解密時反向查表還原。

二、柵欄密碼

柵欄密碼屬於置換密碼,將明文按固定間隔分組(如奇偶位置分為兩組),再將各組字元依序拼接形成密文。例如明文 ASDFGHJKL 分為兩組:ADGJL(奇數位)與 SFHK(偶數位),合併後得 ADGJLSFHK。

特點:實作簡單、可逆,但安全性較低,通常作為多層加密的一環。

三、Java 實作:三層加密架構

本方案採用 柵欄 → 柵欄 → 摩斯 三層疊加:

  1. 第一層:柵欄加密
  2. 第二層:再次柵欄加密(增加置換複雜度)
  3. 第三層:摩斯密碼編碼(將字元轉為符號序列)

解密順序相反:摩斯解碼 → 柵欄解密 → 柵欄解密。

核心類別設計

1. Fence 類(柵欄加解密)
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();
    }
}
2. Morse 類(摩斯加解密 + 整合柵欄)
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()));
    }
}

四、安全性與實務建議

  • 教學價值高:展示對稱加密、置換與替換的基本原理。
  • 不適合生產環境:古典密碼易受頻率分析、已知明文攻擊,金鑰空間極小。
  • 現代替代方案:生產系統應使用 AES、BCrypt、PBKDF2、Argon2 等經過驗證的加密/雜湊演算法,並妥善管理金鑰。

五、總結

透過摩斯密碼與柵欄密碼的組合實作,我們不僅複習了字串處理、集合映射、演算法邏輯,更理解了「多層防禦」的基本思想。雖此方案不具實戰安全性,但作為資安入門與 Java 程式設計練習極為合適。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved