当加密不是块大小的偶数倍的数据时,我是否必须发送完整的最后一个块?

时间:2010-05-16 22:18:35

标签: encryption aes

如果我使用的是块密码为128位的块密码,如果我的数据不是128位的偶数倍,我该怎么办?我正在处理数据包,并且在加密数据时不想更改数据包的大小,但我的数据不是128的偶数倍?

AES分组密码是否允许处理最后一个短的块,而不会在加密后更改消息的大小?

4 个答案:

答案 0 :(得分:7)

这种细节取决于您使用的链接模式。链接模式定义了调用AES原语的次数。以及对于给定的输入消息的内容。最简单的链接模式包括简单地将输入数据分成连续的16字节块并独立地加密它们中的每一个;这被称为 ECB (作为“电子密码本”)并且已知它具有弱点(即,如果两个输入块相同,在“现实生活”数据中频繁出现,那么这两个相应的输出块也将彼此相等,任何人都可以看到)。

某些链接模式会扩大数据,即加密的消息将略大于输入消息。其他链接模式(例如CTR)则不然。几乎所有安全链接模式都需要处理“初始值”,这是一段数据(通常与块大小相同),不需要保密,但必须为发送方和接收方都知道,并且必须是独特的对于每条消息。一些模式(例如CBC)需要均匀随机 IV,而一些其他模式将满足于简单的计数器。通常将IV与加密消息一起发送。您还可以使用散列函数从密钥本身派生IV。

这些事情很棘手,很难知道你是否做得对:安全无法测试;弱密码系统编译和运行就像任何其他应用程序一样。建议不要设计自己的加密协议。完全没有。使用健壮的原语并不能保证结果是安全的。

答案 1 :(得分:1)

使用块密码,您需要指定由于此事实而发送的消息的长度,然后使用随机数据填充最后一个块的未使用部分。您可能应该使用cipher mode。更不用说HMAC或某种完整性系统,具体取决于您使用AES的目的。

AES简单地说明了如何将16字节数据加密成块而不是其他任何内容。

答案 2 :(得分:0)

算法本身要求每个块都是128位,但实际上它取决于特定的实现。但是,如果这是一个要求而不是由实现自动支持,那么是什么阻止你用零填充数据以使其成为128的倍数?

答案 3 :(得分:0)

这真的是一个实现细节。虽然该算法需要一个完整的块,但您的实现可能会用零或随机数据填充最后一个块。