56位DES被填充为64位,导致一个字节的解密不足

时间:2017-03-10 15:28:43

标签: java cryptography des

我有这个问题。我使用56位密钥加密DES,输入块大小为64位。

块大小为8个字节,我设法解密前7个字节。但是,对于最后的字节,DES是56位,它被填充为64位,因此我的解密消息缺少一个字节。

当我到达第7个循环时,plaintext1已经为空,因此我只有一个字节短缺。

有什么方法可以解决这个问题吗?

修改

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);
}

1 个答案:

答案 0 :(得分:2)

DES有一个56位密钥,编码为8字节,每个字节的最低有效位可用于验证每个字节的奇偶校验,但密码本身不使用它。

DES是一种面向块的加密方法,因此输入数据需要是块大小的精确倍数:8字节。如果输入数据大小不是精确倍数,则必须填充。如果需要填充,则必须在加密前附加并在解密后删除。通常的填充是PKCS#5。通常可以为使用ECB或CBC操作模式的分组密码配置填充模式。

当无法计算plainttext大小且最后一个字节可以具有任何值时,则始终需要应用填充。即使输入大小是块大小的精确倍数,也是如此。否则,无法判断解密后最后一个字节是由填充还是明文组成。