1

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

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

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

00000000 00000000 00000000 00000000 00000000 00000000 00000000 11100110</p>

?

4

1 回答 1

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

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

  2. 如果您在消息之前添加消息的长度(例如,不仅在第一个块中,而且在第一个块中的第一件事),它会降低有时添加/删除零的能力。它还减轻了攻击者通过添加整个任意额外块来伪造消息的能力。所以这是一件好事。出于完全实际的原因,这也是一个好主意 - 您无需依赖任何外部手段即可知道消息的字节数。

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

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

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

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

警告 大概这个问题的目的只是为了学习。任何认真的使用都应该考虑一个更强大的 MAC,例如其他评论和一个好的加密库所建议的。还有其他可能非常微妙的弱点和攻击,因此您永远不应该尝试实现自己的加密。我们俩都不是加密专家,这应该只用于学习。

顺便说一句,我推荐 Bruce Schneier 的以下两本书:

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

于 2015-12-03T08:52:38.167 回答