我想知道以下为一组设备生成密钥的过程是否安全。
假设我有一个高熵的128位主键MK。我使用KDF为每个设备生成128位设备密钥DK:
DK1 = KDF(MK, salt1)
DK2 = KDF(MK, salt2)
…例如,salt是设备的序列号。
设备密钥被分配给设备。他们使用自己的设备密钥和相同的KDF生成128位的消息密钥:
K1 = KDF(DK1, mc)其中mc是一个消息计数器。
密钥用于加密或CMAC身份验证。
当设备与后端系统通信时,后端可以通过
K1 = KDF( KDF(MK, salt1), mc)这安全吗?根据NIST/SP 800-38B,KDF的建议是CMAC。
发布于 2019-02-21 19:06:56
您可以这样做:本质上,如果初始密钥是一致随机的,并且没有其他用途,那么您可以安全地将由不同标签派生的密钥视为相互独立的均匀随机。唯一的危险是,如果您可能意外地将相同的标签序列用于两个不同的目的,这将是灾难性的。因此,请确保每个标签序列唯一地标识一个键可能用于的角色。(从形式上讲,KDF是PRF,因此如果密钥是均匀随机的,则很难区分输出是否为均匀随机。)
但你要用mc做什么?大多数经过身份验证的密码,如AES-GCM,像AES-OCB,如NaCl crypto_secretbox_xsalsa20poly1305等,都是设计用来在一个密钥下处理多个消息的。除了“SIV”方案,特别是不隐藏重复的消息,这些都需要一些额外的输入来区分它们-一个随机的初始化向量,或一个唯一的现在。如果您不重复消息计数器,则消息计数器将成为优秀的即时消息。
因此,虽然这没有问题,只要标签唯一地标识关键角色,您就不需要这么做了--只需使用标准的经过身份验证的密码,并将消息计数器作为当前!
https://crypto.stackexchange.com/questions/43523
复制相似问题