我目前正在根据非常标准的密码学原理完成一个学校项目。虽然我需要的大部分功能都能正常运行,但在手动实现 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;
}