使用ICE密钥的重复XOR加密结果长度异常问题排查
重复XOR加密结果长度异常问题排查
问题描述
我用密钥“ICE”实现重复XOR加密字符串,算法逻辑看起来没问题,但生成的十六进制结果比正确答案多5字节,且前半部分和正确答案完全一致。想知道实现时是不是漏了关键步骤?附上我的Java代码:
public class ES5 { public static void main(String[] args) { String str1 = "Burning 'em, if you ain't quick and nimble"; String str2 = "I go crazy when I hear a cymbal"; String correct1 = "0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a2622632427276527"; byte[] cr = Encript(str1.getBytes(StandardCharsets.UTF_8), "ICE"); String cr22 = HexFormat.of().formatHex(cr); System.out.println(cr22); System.out.println(correct1); } private static byte doXOR(byte b, byte b1) { return (byte) (b ^ b1); } private static byte[] Encript(byte[] bt1, String ice) { int x = 0; byte[] rt = new byte[bt1.length]; for (int i = 0; i < bt1.length; i++) { rt[i] = doXOR(bt1[i], (byte) (ice.charAt(x) & 0x00FF)); x++; if (x == 3) x = 0; } return rt; } }
问题分析与解决
你的重复XOR加密逻辑完全正确,没有遗漏关键步骤——循环复用密钥字节与明文字节异或的逻辑是对的,密钥循环重置的处理也没问题。
问题出在输入的明文字符串str1上:你的str1字节长度比正确明文多了5字节(比如可能不小心多加了空格或其他字符),导致加密后结果自然多了5字节。前半部分和正确答案一致,说明前半段明文是对的,只是后面多了5个额外字符。
验证方法:打印str1.getBytes(StandardCharsets.UTF_8).length,对比正确明文的字节数(对应正确答案correct1的长度是62个十六进制字符,即31字节),如果你的结果是36,就说明确实多了5字节。
代码优化建议
可以把密钥预先转成字节数组,简化循环逻辑,避免重复的字符转字节操作:
private static byte[] Encript(byte[] bt1, String ice) { byte[] iceBytes = ice.getBytes(StandardCharsets.UTF_8); byte[] rt = new byte[bt1.length]; for (int i = 0; i < bt1.length; i++) { rt[i] = (byte) (bt1[i] ^ iceBytes[i % iceBytes.length]); } return rt; }
内容的提问来源于stack exchange,提问作者Matteo Pagliarello
相关产品推荐
相关产品推荐

