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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:15:41