Luk*_*hne 4 cryptography cmac message-authentication-code
http://en.wikipedia.org/wiki/CMAC
http://www.rfc-archive.org/getrfc.php?rfc=4493
有两个键K1和K2。除了消息 1 与 10^127(1 和 127 个零)不同之外,还有其他原因吗
如果消息携带长度(并且长度也是 CMAC-ed 的消息),仅使用一个随机生成的 K 是否存在任何安全弱点?
首先,AES-CMAC 中实际上只有一个密钥K - 它是您必须生成的唯一一个密钥,以解决您的最后一个问题,并且在规范中明确说明了这一点:
子密钥生成算法,Generate_Subkey(),采用密钥 K,这正是 AES-128 的密钥。
您的另一个问题 - 为什么我们需要从K生成K1和K2 - 有点难以回答,但实际上有一个非常简单的解释:消除消息身份验证中的任何歧义。
为了说明这一点,假设我们从 wiki 文章中获取二进制密钥:K1 = 0101 和K2 = 0111。现在让我们处理消息M = 0101 011。因为M不是由完整的块(三位而不是四位)组成,我们必须垫它。现在我们有M' = 0101 0111。
要生成该消息的 MAC,我们只需对密钥进行异或:
M' = 0101 0111
K1 = 0101
K2 = 0111
MAC = 0000 0000
Run Code Online (Sandbox Code Playgroud)
如果我们在这两种情况下都使用了K1,那么我们将有以下过程:
M' = 0101 0111
K1 = 0101
K1 = 0101
MAC = 0000 0010
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但是请注意当我们尝试为M'' = 0101 0111 生成 MAC 时会发生什么(即,未填充的消息M''与填充的消息M'相同)。
M'' = 0101 0111
K1 = 0101
K1 = 0101
MAC = 0000 0010
Run Code Online (Sandbox Code Playgroud)
我们从两条不同的消息生成了相同的 MAC!使用第二个密钥(它具有一些数论属性,可以防止它与K1有问题地“相似” )可以防止这种歧义。