XOR加解密程序问题:引入前序加密字符后解密失败求助
问题分析:基于XOR的加解密程序解密失败原因
核心错误点
你的解密函数存在两个关键问题:
- 公式推导错误:解密时误用了前一个明文
msg[i-1],正确推导需要使用前一个加密后的密文letters[i-1] - 语法错误:解密循环代码多了一个右括号,导致编译失败
加密公式回顾
加密逻辑的公式是:
- 首字符:
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
相关产品推荐
相关产品推荐

