You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XOR加解密程序问题:引入前序加密字符后解密失败求助

问题分析:基于XOR的加解密程序解密失败原因

核心错误点

你的解密函数存在两个关键问题:

  1. 公式推导错误:解密时误用了前一个明文msg[i-1],正确推导需要使用前一个加密后的密文letters[i-1]
  2. 语法错误:解密循环代码多了一个右括号,导致编译失败

加密公式回顾

加密逻辑的公式是:

  • 首字符:enc[0] = c[0] ^ k[0]
  • 后续字符:enc[i] = c[i] ^ k[i] ^ enc[i-1]

正确的解密公式推导

从加密公式反推解密逻辑:
对enc[i] = c[i] ^ k[i] ^ enc[i-1]两边同时异或enc[i-1]和k[i],可得:
c[i] = enc[i] ^ enc[i-1] ^ k[i]
这里的enc[i-1]是加密后的前一个密文,不是解密出的前一个明文。

修正后的代码

public class Main{
    public static void main(String[] args){

        char[] charArray1 = {'a', 'b', 'c', 'd', 'e'};
        int[] keys1 = genereateKeys(charArray1.length);
        
        int[] encrypted1 = encrypt(charArray1, keys1);
        printCharArray(decrypt(encrypted1, keys1));

        char[] charArray2 = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
        int[] keys2 = genereateKeys(charArray2.length);
        
        int[] encrypted2 = encrypt(charArray2, keys2);
        printCharArray(decrypt(encrypted2, keys2));
    }

    // 补充缺失的密钥生成方法示例
    public static int[] genereateKeys(int length) {
        int[] keys = new int[length];
        // 可替换为你实际的密钥生成逻辑,比如随机数
        for (int i = 0; i < length; i++) {
            keys[i] = (int)(Math.random() * 256);
        }
        return keys;
    }

    public static void printCharArray(char[] letter){
        for(int i = 0; i < letter.length; ++i)
            System.out.print(letter[i]);
        
        System.out.println();
    }

    public static int[] encrypt(char[] letters, int[] keys){
        int[] msg = new int[letters.length];
        msg[0] = ((int)letters[0]) ^ keys[0];
        for(int i = 1; i < letters.length; ++i){
            msg[i] = ((int)letters[i]) ^ keys[i] ^ msg[i - 1];
        }
        return msg;
    }

    public static char[] decrypt(int[] letters, int[] keys){
        char[] msg = new char[letters.length];
        msg[0] = (char)(letters[0] ^ keys[0]);
        for(int i = 1; i < letters.length; ++i){
            // 修正公式:使用前一个密文letters[i-1],而非前一个明文msg[i-1]
            msg[i] = (char)(letters[i] ^ letters[i-1] ^ keys[i]);
        }
        return msg;
    }
}

修正说明

  • 修复了解密函数的公式错误:将(letters[i] ^ keys[i]) ^ msg[i-1]改为letters[i] ^ letters[i-1] ^ keys[i],符合推导后的解密逻辑
  • 移除了解密代码中多余的右括号,解决语法错误
  • 补充了缺失的genereateKeys方法示例(原代码未实现会导致编译失败)

内容的提问来源于stack exchange,提问作者yad0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:17:48