我目前正在努力完成基于相当标准的加密原则的学校项目。虽然我有大部分需要正常运行的功能,但在手动实现CFB和PCBC分组密码时遇到了一个问题。我的源代码是用Java编写的,我相信这个问题可能涉及到在进行加密操作或字节操作时我没有考虑到的事情。对于这两种密码,使用的加密是3DES,我已经单独测试了它,它的功能与我期望的一样。目前我只想解决一个简单的情况,其中诸如“testtest”(即16bytes)之类的字符串被正确加密/解密。对于< = 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;
}