Java加密:CFB和PCBC(不基于API)

Java加密:CFB和PCBC(不基于API),java,encryption,cryptography,Java,Encryption,Cryptography,我目前正在完成一个基于标准密码学原理的学校项目。虽然我有大部分我需要的功能正常,但在手动实现CFB和PCBC块密码时遇到了一个问题。我的源代码是用Java编写的,我相信这个问题可能涉及到一些我在进行加密操作或字节操作时没有考虑到的事情。对于这两种密码,使用的加密都是3DES,我已经分别进行了测试,它的功能与我预期的一样。目前,我只想解决一个简单的例子,在这个例子中,像“testtest”(即16字节)这样的字符串被正确加密/解密。对于的情况,第二个块的密文跳得太远了 TripleDES的块大小为

我目前正在完成一个基于标准密码学原理的学校项目。虽然我有大部分我需要的功能正常,但在手动实现CFB和PCBC块密码时遇到了一个问题。我的源代码是用Java编写的,我相信这个问题可能涉及到一些我在进行加密操作或字节操作时没有考虑到的事情。对于这两种密码,使用的加密都是3DES,我已经分别进行了测试,它的功能与我预期的一样。目前,我只想解决一个简单的例子,在这个例子中,像“testtest”(即16字节)这样的字符串被正确加密/解密。对于的情况,第二个块的密文跳得太远了

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

我猜解密算法实现只需要传递它的数组中的前8个字节,因此它成功地解密了第一个块(字节0-7)(如您所示)。然后它跳到索引+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()));

我打赌一切都会开始运作。

block
block
。。。看起来您省略了所有重要的代码。块只是大小为8字节[]的存储单元。我想我不太清楚确切的问题。仅供参考:PCBC和CFB都是分组密码操作模式,而不是分组密码本身。它们使像3DES这样的分组密码能够对大于其块大小的输入进行操作。
 // P2
block.setBlock(XOR(tripleDES.get3DESDecryption(Arrays.copyOfRange(
        input, idxA + 8, idxB + 8)), Arrays.copyOfRange(input, idxA,
        idxB), output[0].getBlock()));