CBC MAC:消息长度和长度前置 我想在C++中使用CBC MAC。首先,我希望找到一些分组密码的实现,我将在CBC模式下使用,我知道这是CBC MAC。但我有两个问题:

CBC MAC:消息长度和长度前置 我想在C++中使用CBC MAC。首先,我希望找到一些分组密码的实现,我将在CBC模式下使用,我知道这是CBC MAC。但我有两个问题:,c++,authentication,cbc-mac,C++,Authentication,Cbc Mac,1) 如果要验证的消息长度不是分组密码块长度的倍数,我该怎么办 2) 为了加强CBCMAC,Wiki上提到的一个推荐方法是将消息的长度放在第一个块中。但是我应该如何将长度编码为字符串呢?还是二进制?如果密码的块长度是64位,我是否将数字编码为64位数字?e、 g.如果消息长度为230,我应使用以下值作为第一个块: 00000000000000000000000000000000000000000000000000000000000000000000000000000000‭11100110‬ ?

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

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

00000000000000000000000000000000000000000000000000000000000000000000000000000000‭11100110‬

?

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

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

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

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

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

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


  • 有许多块密码的开源C实现,比如AES,很容易找到并开始工作

    警告 大概这个问题的目的只是为了学习。任何严肃的使用都应该考虑一个更强的MAC,比如其他评论和一个好的密码库。还有其他一些非常微妙的弱点和攻击,因此您不应该尝试实现自己的加密。我们两人都不是密码专家,这样做只是为了学习

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


    (免责声明:我不是专家)通常用于对齐输入块(您需要填充“长度消息”部分)。如果长度编码由您决定,我打赌它本身应该有一个恒定的长度,并且是明确的。您是否考虑过另一种可能更有效的算法(例如HMAC)?我想你一定应该使用一些加密库(例如)。祝你好运我想知道为什么你的问题很少被关注(肯定有人知道正确的答案),也许应该在crypto.stackexchange.com上提问…(我在这里是很新知道的)带长度预编的CBCMAC应该是相当安全的。PS我的意思是wiki说应该将长度作为消息的第一个块,这就是为什么如果密码块长度为64位,我将其表示为64位整数的原因“块密码的开源C实现,如AES”大多数库使用起来都很麻烦,但我发现AES实现被一个流行软件使用,而且似乎是stableYes,但是你不需要使用整个第一个街区。您可以使用16位长度,前6个字符使用48位。我怀疑你真的需要64位的长度。你看过TomCrypt吗?它有很多实现?很好,我可以使用整个块