http://en.wikipedia.org/wiki/CMAC
http://www.rfc-archive.org/getrfc.php?rfc=4493
有两个键 K1 和 K2。除了消息 1 与 10^127 不同(1 和 127 个零)之外,还有其他原因吗
如果消息携带长度(并且长度也是 CMAC-ed whit 消息),那么仅使用一个随机生成的 K 是否存在任何安全漏洞?
http://en.wikipedia.org/wiki/CMAC
http://www.rfc-archive.org/getrfc.php?rfc=4493
有两个键 K1 和 K2。除了消息 1 与 10^127 不同(1 和 127 个零)之外,还有其他原因吗
如果消息携带长度(并且长度也是 CMAC-ed whit 消息),那么仅使用一个随机生成的 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,我们只需对我们的密钥进行 XOR:
M' = 0101 0111
K1 = 0101
K2 = 0111
MAC = 0000 0000
如果我们在这两种情况下都使用了K1,那么我们将有以下过程:
M' = 0101 0111
K1 = 0101
K1 = 0101
MAC = 0000 0010
这一切都很好,但是请注意当我们尝试为M'' = 0101 0111 生成 MAC 时会发生什么(即,未填充的消息 M ''与填充的消息M'相同)。
M'' = 0101 0111
K1 = 0101
K1 = 0101
MAC = 0000 0010
我们从两条不同的消息中生成了相同的 MAC!使用第二个键(它具有一些数论属性,可以防止它与K1有问题地“相似” )可以防止这种歧义。
我不相信它与已知明文攻击有关,我不同意对称密码容易受到它们的影响。密码安全的条件之一是它在 KPA、CPA(选择明文攻击)和 CCA(选择密文攻击)下是安全的。
除非我不理解您的问题,否则您仍然需要两个子项。当一个块不是一个完整的块时使用 K2。. K1 和 K2 不是随机生成的,而是从 K 派生的。您是否有不想生成这些子键的原因?
基于链接模式的身份验证代码存在许多弱点。CBC-MAC 仅对固定大小的消息被证明是安全的。对于填充最后一个块的可变长度消息,安全性完全失败。
您可以阅读 XCBC 论文以了解攻击的工作原理:
“举个简单的例子,注意给定单块消息 X 的 CBC MAC,比如 T = CBCEK(X),对手立即知道两块消息 X || (X ^ T) 的 CBC MAC,因为这又是T。”
我想对称密码很容易受到明文攻击,至少在过去是这样。而且由于您做了一部分明文(填充模式),因此您不想泄露有关您的密钥的信息。如果您可以通过这种方式提取密钥的某些位,您可以暴力攻击最后一个块,但所有其他块仍然是安全的(至少在此 KP 攻击下),因为它们已通过 K1 加密。
为了克服同样的问题,基于块的密码通常以各种模式运行,请参阅: http ://en.wikipedia.org/wiki/Block_cipher_modes_of_operation 。不知道为什么在 CMAC 的设计中没有考虑这种明显的解决方案。