我有这个问题。我获得了使用 56 位 key 和 64 位输入 block 大小的 DES 加密。
block 大小为 8 个字节,我成功解密了前 7 个字节。然而,对于最后一个字节,DES 是 56 位,它被填充为 64 位,因此我的解密消息缺少一个字节。
当我到达第七个循环时,明文 1 已经为空,因此我缺少一个字节。
有什么办法可以解决这个问题吗?
编辑
String plaintext1 = "ZZZZZZZ";
//removed line
System.out.println(Arrays.toString(plaintext1 .getBytes()));
System.out.println(plaintext1 );
public static byte[] paddingBytes(byte[] input, int blockSize) {
int paddingSize = (blockSize - (input.length % blockSize)) % blockSize;
byte[] padding = new byte[paddingSize];
return concat(input, padding);
}
最佳答案
DES 有一个 56 位 key ,编码为 8 个字节,每个字节的最低有效位可用于验证每个字节的奇偶校验,但密码本身不使用它。
DES 是一种面向 block 的加密方法,因此输入数据需要是 block 大小的精确倍数:8 字节。如果输入数据大小不是精确倍数,则必须对其进行填充。如果需要填充,则必须在加密之前附加它,并在解密之后删除它。通常的填充是 PKCS#5 。通常可以为使用 ECB 或 CBC 操作模式的分组密码配置填充模式。
当无法计算明文大小并且最后一个字节可以具有任何值时,则始终需要应用填充。即使输入大小是 block 大小的精确倍数也是如此。否则解密后无法判断最后一个字节是填充还是明文。
关于java - 56 位 DES 被填充为 64 位,导致一字节解密不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42722016/