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的任何安全漏洞?
答案 0 :(得分:4)
首先,AES-CMAC中只有一个 K 键 - 它是您必须生成的唯一一个,以解决您的上一个问题,并在规范中明确说明:
子密钥生成算法Generate_Subkey()采用密钥K,这只是AES-128的密钥。
你的另一个问题 - 为什么我们需要从 K 生成 K1 和 K2 - 有点难以回答,但是实际上是一个非常简单的解释:消除消息认证中的任何歧义。
为了说明,假设我们从维基文章中获取二进制密钥: K1 = 0101和 K2 = 0111.现在让我们播放消息 M < / em> = 0101 011.因为 M 不是由完整的块(三位而不是四位)组成,所以我们必须填充它。现在我们有 M' = 0101 0111。
要为此消息生成MAC,我们只需要对我们的密钥进行异或操作:
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 “相似”)可以防止出现这种歧义。
答案 1 :(得分:2)
我不相信它与已知明文攻击有关,我不同意对称密码对它们很敏感。密码安全的一个条件是它在KPA,CPA(选择明文攻击)和CCA(选择密文攻击)下是安全的。
除非我不理解您的问题,否则,您仍需要两个子项。当块不是完整块时使用K2。 。 K1和K2不是随机生成的,而是从K派生的。您是否有理由不想生成这些子项?
基于链接模式的身份验证代码存在许多缺陷。 CBC-MAC仅对固定大小的消息是可靠的。对于填充最后一个块的可变长度消息,安全性完全失败。
您可以阅读XCBC论文,了解攻击的工作原理:
“作为一个简单的例子,请注意,给出CBC MAC的单块消息X,比如说 T = CBCEK(X),对手立即知道双块消息X ||的CBC MAC (X ^ T) 因为这又是T。“
答案 2 :(得分:1)
我认为对称密码容易受到明文攻击,至少它们已经过去了。并且由于您执行了明文的一部分(填充模式),因此您不希望泄漏有关密钥的信息。如果您可以通过这种方式提取密钥的某些位,则可以强制攻击最后一个块,但所有其他块保持安全(至少在此KP攻击下),因为它们已通过K1加密。
为了克服同样的问题,基于块的密码通常以各种模式运行,请参阅: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation。不知道为什么在CMAC的设计中没有考虑这个明显的解决方案。