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

Java 異或加密算法:原理、實現與安全性邊界全解析

     編輯:Java 相關知識

核心原理

異或運算 (^) 滿足 自逆性:A ^ B ^ B = A。即:加密與解密使用完全相同的操作。

明文:  01101001 (105 'i')
密鑰:  00110000 (48  '0')
密文:  01011001 (89  'Y')
解密:  01011001 ^ 00110000 = 01101001 → 'i'

最小可用實現

public class XorCipher {
    private final int key; // 0-255 單字節密鑰

    public XorCipher(int key) {
        this.key = key & 0xFF;
    }

    /** 加密/解密統一入口 */
    public String transform(String data) {
        if (data == null) return null;
        char[] chars = data.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] ^ key);
        }
        return new String(chars);
    }

    /** 字節數組版本 (適合二進制數據) */
    public byte[] transform(byte[] data) {
        byte[] out = new byte[data.length];
        for (int i = 0; i < data.length; i++) {
            out[i] = (byte) (data[i] ^ key);
        }
        return out;
    }
}

// 使用
XorCipher cipher = new XorCipher(0x3A); // 密鑰 58
String encrypted = cipher.transform("Hello World");
String decrypted = cipher.transform(encrypted);
System.out.println(encrypted); // 亂碼
System.out.println(decrypted); // Hello World

進階:多字節密鑰 (重複密鑰流)

public class MultiByteXorCipher {
    private final byte[] keyBytes;

    public MultiByteXorCipher(String key) {
        this.keyBytes = key.getBytes(StandardCharsets.UTF_8);
    }

    public byte[] transform(byte[] data) {
        byte[] out = new byte[data.length];
        for (int i = 0; i < data.length; i++) {
            out[i] = (byte) (data[i] ^ keyBytes[i % keyBytes.length]);
        }
        return out;
    }
}

安全性邊界:為什麼生產環境「嚴禁」使用

弱點攻擊手段後果
密鑰重複 (單字節/短密鑰)頻率分析、已知明文攻擊幾秒破解
無完整性校驗比特翻轉攻擊竄改數據無感知
無隨機性 (IV/Nonce)相同明文產生相同密文模式洩露、重放攻擊
密鑰管理缺失硬編碼、傳輸明文密鑰洩露即崩潰

何時可以使用?

  • 教學演示、CTF 題目、簡易混淆 (非安全)
  • 嵌入式設備極度受限、僅需防「誤讀」非防「破解」
  • 作為更高級算法的構建塊 (如 ChaCha20 核心即 XOR + 置換)

生產級替代方案

// AES-GCM (認證加密,推薦)
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
GCMParameterSpec spec = new GCMParameterSpec(128, nonce); // 12字節 nonce
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] cipherText = cipher.doFinal(plainText);
// 輸出: cipherText + nonce + authTag (或合併存儲)

總結

異或加密以 自逆性 著稱,代碼極簡 (data[i] ^ key),但 缺乏擴散性、混淆性、完整性、前向保密 等現代密碼學基本屬性。理解其數學本質有助於掌握流密碼、分組密碼模式、認證加密等高級主題。切記:任何業務敏感數據,請直接使用 AES-GCM / ChaCha20-Poly1305 等經標準化驗證的認證加密算法。

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