对于分组密码,当明文的大小不是分块大小的倍数时,可能需要填充。PKCS #5 填充方案被许多分组密码算法广泛使用。我们将通过以下实验来了解这种填充的是怎样工作的:
首先,分别使用 ECB 、 CBC 、 CFB 和 OFB 模式加密一个文件(可以选择任何加密算法)。请报告哪些模式有填充,哪些没有。对于那些不需要填充的工作模式,请解释为什么它不需要填充。
然后创建三个文件,分别包含 5 个字节, 10 个字节和 16 个字节。可以使用以下 echo -n 命令创建此类文件。下面的示例创建了一个长度为 5 的文件 f1.txt(如果不带 -n 选项,长度会是 6 ,因为 echo 会添加一个换行符):
$ echo -n "12345" > f1.txt
接下来我们通过 “openssl enc -aes-128-cbc -e” 命令来使用 128-bit AES 算法和 CBC 模式加密这三个文件。请描述加密后的文件的大小。
观察在加密的过程中填充了哪些内容。使用 openssl enc -aes-128-cbc -d 命令可以解密这些文件。但是,默认情况下解密过程中会去除这些填充,导致我们无法看到填充的内容。好在该命令有一个 -nopad 选项,可以在解密的过程中不去除填充的数据。因此,通过查看解密后的数据,我们可以看到填充的数据。请用这种方法找出这三个文件被添加了哪些填充数据。
注意,填充的数据可能无法打印出来,你需要使用十六进制工具来显示这些数据。下面的例子展示了如何用十六进制的格式显示一个文件。
$ hexdump -C p1.txt
00000000 31 32 33 34 35 36 37 38 39 49 4a 4b 4c 0a |123456789IJKL.|
$ xxd p1.txt
00000000: 3132 3334 3536 3738 3949 4a4b 4c0a 123456789IJKL.