首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMAC为什么选择K1和K2

CMAC为什么选择K1和K2
EN

Stack Overflow用户
提问于 2010-08-17 21:59:33
回答 3查看 2.8K关注 0票数 3

http://en.wikipedia.org/wiki/CMAC

http://www.rfc-archive.org/getrfc.php?rfc=4493

有两个键K1和K2。除了消息1与10^127 (1和127个0)不同之外,还有其他原因吗?

如果消息携带长度(并且长度也是CMAC-ed whit消息),是否存在仅使用一个随机生成的K的安全漏洞?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-17 23:04:48

我不认为这与已知的明文攻击有关,我也不同意对称密码容易受到攻击。密码安全的条件之一是它在KPA、CPA (选择明文攻击)和CCA (选择密文攻击)下是安全的。

除非我没有理解你的问题,是的,你仍然需要这两个子键。当一个块不是一个完整的块时,使用K2。。K1和K2不是随机生成的,而是从K派生的。您不想生成这些子密钥有什么原因吗?

基于链接模式的验证码存在许多弱点。可以证明,CBC-MAC只对固定大小的消息是安全的。对于最后一个块被填充的可变长度消息,安全性完全失败。

您可以阅读XCBC论文以了解攻击是如何工作的:

作为一个简单的示例,请注意,给定一个块消息X的CBC MAC,假设T= CBCEK (X ),对手立即知道两个块消息X || (X^T)的CBC MAC,因为这又是T。

1

票数 2
EN

Stack Overflow用户

发布于 2010-08-17 23:03:45

首先,AES-CMAC中实际上只有一个密钥K-它是您必须生成的唯一密钥,以解决您的最后一个问题,这在规范中有明确的说明:

AES子密钥生成算法Generate_Subkey()采用密钥K,这正是

-128的密钥。

你的另一个问题-为什么我们需要从K生成K1和K2 -有点难以回答,但实际上有一个非常简单的解释:消除消息身份验证中的任何歧义。

为了说明,假设我们取自维基文章中的二进制密钥: K1 =0101and K2 = 0111。现在让我们使用消息M=0101011。因为M不是由完整的块(3比特而不是4比特)组成的,所以我们必须填充它。现在我们有M‘=01010111。

要生成此消息的MAC,我们只需将密钥XOR:

代码语言:javascript
复制
M'  = 0101 0111
K1  = 0101
K2  =      0111
MAC = 0000 0000

如果我们在这两种情况下都使用了K1,那么我们将使用以下过程:

代码语言:javascript
复制
M'  = 0101 0111
K1  = 0101
K1  =      0101
MAC = 0000 0010

这一切都很好,但请注意当我们尝试为M'‘= 0101 0111生成MAC时会发生什么(即,未填充的消息M'’与填充的消息M‘相同)。

代码语言:javascript
复制
M'' = 0101 0111
K1  = 0101
K1  =      0101
MAC = 0000 0010

我们已经从两个不同的消息生成了相同的MAC!第二个密钥的使用(它具有一些数论属性,防止它在问题上与K1“相似”)防止了这样的歧义。

票数 5
EN

Stack Overflow用户

发布于 2010-08-17 22:49:27

我认为对称密码很容易受到明文攻击,至少在过去是这样。而且,由于您做了明文(填充模式)的一部分,因此您不希望泄露有关密钥的信息。如果您能以这种方式提取密钥的一些位,您就可以暴力破解最后一个块,但所有其他块都保持安全(至少在这种KP攻击下),因为它们是通过K1加密的。

为了克服同样的问题,基于块的密码通常在各种模式下运行,请参阅:http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation。我不知道为什么在CMAC的设计中没有考虑这个显而易见的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3503204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档