0

我目前正在根据非常标准的密码学原理完成一个学校项目。虽然我需要的大部分功能都能正常运行,但在手动实现 CFB 和 PCBC 分组密码时遇到了问题。我的源代码是用 Java 编写的,我相信这个问题可能涉及我在执行加密操作或字节操作时没有考虑到的事情。对于这两种密码,使用的加密都是 3DES,我已经单独对其进行了测试,它的功能与我期望的一样。目前,我只是想解决一个简单的情况,在这种情况下,诸如“testtest”(即 16 字节)之类的字符串被正确加密/解密。对于 <=8 字节的情况,代码按预期运行(无论是否幸运,哈哈)。到目前为止,我的核心功能代码是:

// for now encrypting at byte block level
protected String decrypt3DES_PCBC(byte[] input) throws Exception {
    System.out.println("Length of input @derypt: " + input.length);
    Block[] output = new Block[input.length];
    int idxA = 0, idxB = 16;
    // P1
    block.setBlock(XOR(tripleDES.get3DESDecryption(Arrays.copyOfRange(
            input, idxA, idxB)), IV));
    output[0] = block;
    System.out.println("decrypt length: " + output[0].getBlock().length);
    System.out.println("Initial decoded block: "
            + new String(output[0].getBlock(), "UTF-16BE"));

    // P2
    block.setBlock(XOR(tripleDES.get3DESDecryption(Arrays.copyOfRange(
            input, idxA + 16, idxB + 16)), Arrays.copyOfRange(input, idxA,
            idxB), output[0].getBlock()));
    output[1] = block;
    System.out.println("decrypt length: " + output[1].getBlock().length);
    System.out.println("Next decoded block: "
            + new String(output[1].getBlock(), "UTF-16BE"));

    return null;
}

private byte[] XOR(byte[] pt, byte[] cText) {
    byte[] output = new byte[pt.length];
    for (int i = 0; i < output.length; i++) {
        output[i] = (byte) (cText[i] ^ pt[i]);
    }
    return output;
}

private byte[] XOR(byte[] pt_0, byte[] pt_1, byte[] ct) {
    byte[] output = new byte[pt_0.length];
    for (int i = 0; i < output.length; i++) {
        output[i] = (byte) (pt_0[i] ^ pt_1[i] ^ ct[i]);
    }
    return output;
}
4

1 回答 1

0

对于第二个块,您在密文中跳得太远了。

TripleDES 的块大小为 64 位,转换为 8 个字节。您的代码似乎假定块大小为 16 字节,例如 128 位。

我猜解密算法实现只需要你传递它的数组中的前 8 个字节,所以它成功地解密了第一个块(字节 0-7)(正如你所指出的那样)。然后它跳到 index + 16,这将跳过 8-15 的字节。

尝试将初始分配 idxB 更改为 8,然后将您的第二个 setBlock 调用更改为如下内容:

 // P2
block.setBlock(XOR(tripleDES.get3DESDecryption(Arrays.copyOfRange(
        input, idxA + 8, idxB + 8)), Arrays.copyOfRange(input, idxA,
        idxB), output[0].getBlock()));

我敢打赌事情会开始奏效。

于 2013-01-03T22:34:09.867 回答