我有这个问题。我使用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);
}
答案 0 :(得分:2)
DES有一个56位密钥,编码为8字节,每个字节的最低有效位可用于验证每个字节的奇偶校验,但密码本身不使用它。
DES是一种面向块的加密方法,因此输入数据需要是块大小的精确倍数:8字节。如果输入数据大小不是精确倍数,则必须填充。如果需要填充,则必须在加密前附加并在解密后删除。通常的填充是PKCS#5。通常可以为使用ECB或CBC操作模式的分组密码配置填充模式。
当无法计算plainttext大小且最后一个字节可以具有任何值时,则始终需要应用填充。即使输入大小是块大小的精确倍数,也是如此。否则,无法判断解密后最后一个字节是由填充还是明文组成。