CBC MAC:消息长度和长度前置

CBC MAC: message length and length prepending

本文关键字:MAC 消息 CBC      更新时间:2023-10-16

我想在C++中使用CBC MAC。首先,我希望找到一些块密码的实现,我将在CBC模式中使用,我知道它是CBC MAC。但我有两个问题:

1) 如果要验证的消息长度不是分组密码分组长度的倍数,我该怎么办?

2) 为了加强CBC MAC,Wiki上提到的一种推荐方法是将消息的长度放在第一个块中。但是我应该如何将长度编码为字符串呢?还是二进制?如果密码的块长度是64位,我会把数字编码为64位数字吗?例如,如果消息长度为230,我应该使用以下值作为第一个块:

00000000000000000000000000000000‭11100110‬

  1. 这取决于第二个问题。你必须用一些东西"填充"消息,直到它是块大小的倍数。在计算MAC之前,将填充字节添加到消息中,但仅发送/存储原始消息等。

    对于MAC,最简单的方法是用零填充。然而,这有一个漏洞——如果消息部分以一个或多个零结尾,攻击者可以添加或删除零,而不会更改MAC。但如果执行第2步,则此攻击和另一次攻击都会得到缓解。

  2. 如果在消息之前预先设置消息的长度(例如,不仅在第一个块中,而且在第一个区块中的第一件事),则会降低有时添加/删除零的能力。它还降低了攻击者伪造添加了整个任意额外块的消息的能力。因此,这是一件好事。出于完全实际的原因,这也是一个好主意——你可以在不依赖任何外部手段的情况下知道消息的字节数。

    长度的格式是什么并不重要——一些编码的ASCII版本或二进制。然而,作为一个实际问题,它应该始终是简单的二进制。

    长度中的位数没有理由必须与密码块大小匹配。长度字段的大小必须足够大,以表示消息大小。例如,如果消息大小可以在0到1000字节之间,则可以在前面加上一个无符号的16位整数。

    这是在发送器和接收器上计算MAC之前首先完成的。本质上,长度与消息的其余部分同时进行验证,从而消除了攻击者伪造更长或更短消息的能力。

有许多像AES这样的块密码的开源C实现,它们很容易找到并开始工作。

洞穴大概这个问题的目的只是为了学习。任何认真的使用都应该考虑更强的MAC,如其他评论所建议的,以及一个好的加密库。还有其他非常微妙的弱点和攻击,所以你永远不应该试图实现自己的加密货币。我们都不是加密货币专家,这应该只是为了学习。

顺便说一句,我推荐布鲁斯·施奈尔的以下两本书:

http://www.amazon.com/Applied-Cryptography-Protocols-Algorithms-Source/dp/0471117099/ref=asap_bc?ie=UTF8

http://www.amazon.com/Cryptography-Engineering-Principles-Practical-Applications/dp/0470474246/ref=asap_bc?ie=UTF8