使用AES-256-CBC模式openssl的数据加密,不返回不需要填充的相同大小的数据?

时间:2012-11-03 21:44:26

标签: c++ encryption openssl aes

我正在尝试使用openssl AES来加密我的数据我在这个链接中发现了一个非常好的例子。http://saju.net.in/code/misc/openssl_aes.c.txt 但问题是我仍然可以找到填充数据的答案,尽管它执行密钥大小的倍数。 例如,它需要16个字节作为加密输入或16个任意倍数 我给了1024包括null。,它仍然给我一个大小为1040的输出, 但正如我所知道的AES输入大小=输出大小,如果输入是128位/ 16字节的倍数。 任何人在我面前试过这个例子或者能给我任何想法吗? 在此先感谢。

1 个答案:

答案 0 :(得分:4)

大多数填充方案都要求添加一些最小量的填充 。这是(至少主要是)所以在接收端,您可以查看最后一个字节(或最后的一些少量数据),并知道最后有多少数据是填充,以及多少是真实的数据

例如,典型的填充方案在数据之后放置零字节,最后一个字节包含填充的字节数。例如,如果添加了4个字节的填充,则填充字节(以十六进制表示)将类似于00 00 00 04。另一种常见的可能性是在 all 填充字节中使用相同的值,因此它看起来像04 04 04 04

在接收端,算法必须准备好去除填充字节。为此,它查看最后一个字节,告诉它要从末尾删除多少字节的数据并忽略。如果没有填充,那将包含一些值(无论消息中的最后一个字节是什么)。由于无法知道没有添加填充,它会查看该值,并删除那么多字节的数据 - 只有在这种情况下,它才会删除实际数据而不是填充。

虽然有可能设计一个填充方案,避免在/输入恰好是块大小的精确倍数时添加额外数据,但是为每条消息添加至少一个填充字节要简单得多,所以接收器可以指望总是读取最后一个字节,并找出它收到的填充量。