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

标签 java cryptography des

我有这个问题。我获得了使用 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/

相关文章:

ios使用des ecb解密base64编码的字符串

C# - 加密异常 "Bad Hash"

c# - PasswordDeriveBytes (System.Security.Cryptography) 如果处置失败

c - 使用 C 中的密码使用 openssl 加密文件

c# - 三重 DES 加密

c - Linux下的DES加密

java - 解析作为字符串注入(inject)的 htmlpage 吗? (字符串到 XML)

java - 设置方法和递增

java - 从模态 JDialog 打开时激活 JFrame

java - 比 onLoadResource 更快的方法将 javascript 注入(inject)到 webview 中?