物联网 CCM - 选择 L 和 M

信息安全 加密 物联网
2021-08-17 00:08:17

其他开发人员已经为我们即将推出的物联网设备开发了一种定制的内部射频协议。我想用 AE 代替我们对 AES-CTR 的使用——我们的加密库支持 CCM,因此应该具有最低的实施障碍。

CCM 需要两个可调参数 -LM,以及相应的安全权衡。给定对单键协商和简短事务消息的偏好,为L和选择什么好的值M

由于设备支持调度,我估计在安装生命周期内每天大约 100 条消息的上限,我可以慷慨地估计为 30 年。消息通常小于 10 个字节(该协议最多支持 64kib)。我们不会使用关联数据。

我还想随机选择随机数,部分是为了节省存储同步,部分是因为我不是 100% 确信我理解 Wikipedia 上的声明:“一个关键的见解是相同的加密密钥可以用于两者,前提是加密中使用的计数器值不与身份验证中使用的(预)初始化向量发生冲突。” 清楚地。由于生日悖论,这应该会降低密钥的预期寿命。

如果我选择L=2and ,这会提供足够的安全性M=8吗?或者,如果我们预计使用寿命为 30 年,我是否需要重新协商密钥?

编辑:请注意,我关心 的选择L,这似乎会产生安全性权衡(随机数长度与消息长度),而不是M更典型的性能/安全性权衡。

2个回答

身份验证标记 ( M) 应尽可能大。但是,它越大,传输单个消息的开销就越大。通常,您希望标签至少为 80 位,即 10 个八位字节。理想情况下,您应该有一个 128 位或 16 个八位字节或M=16. 较大的标签使攻击者更难以伪造消息而不被捕获。一个 128 位的标签会导致每条伪造的消息有 2 -128的概率被接受,从而抵抗计算受限的攻击者。

消息大小 ( L) 指定随机数的大小(随机数大小为15-L八位字节)。您希望随机数足够大,生日悖论不是问题。为此,96 位或L=3, 就足够了。这个大小是 GCM 在随机 nonce 下使用的标准,已被证明是非常安全的。由于 30 年内每天 100 条消息只产生略多于 10 6条消息,因此理论上使用 64 位随机数也是安全的,但如果发送更多消息,96 位将证明更安全。

每次打开设备时,您都应该使用非对称加密生成新的会话密钥。这将防止记录消息的攻击者在获得单个主密钥后能够追溯解密它们,这可以通过 WPA 和 WPA2 完成。这被称为前向保密,并确保攻击者无法追溯解密旧会话。前向保密需要使用临时 DH 或 ECDH 进行密钥交换,而不是普通的 RSA。

接受的答案很好,但我不确定它是否解决了以下声明:

我也想随机选择nonce

来自 RFC 3610:“在任何加密密钥 K 的范围内,nonce 值必须是唯一的。也就是说,与任何给定密钥一起使用的 nonce 值集不得包含任何重复值。”

换句话说,不要用相同的键重用相同的随机数。

因此,最好考虑在更改密钥之前是否存在随机选择相同随机数的不可忽略的概率。

如果您遵循上述建议L=3,这似乎是合理的。然后您将使用 96 位随机数。如果我假设在最坏的情况下会有10^6相同密钥的消息,那么我们应该看看对于n = 10^6随机抛出我永远不会从m = 2^96可能的随机数中生成相同随机数的概率。

我在第一次随机投掷中没有选择先前选择的随机数的概率是 1。我在第二次随机投掷中没有选择先前选择的随机数的概率(假设我在第一次随机投掷中没有选择,这是肯定的)是(1-1/m)。鉴于我之前的任何一次投掷都没有,我在第三次随机投掷中没有选择先前选择的随机数的概率是 (1-2/m)... 等等。

因此,在总共 n 次随机投掷中,我从不选择相同的 nonce 的概率是:

P(n) = 1(1-1/m)(1-2/m)(1-3/m)...(1-(n-1)/m)

对于n远小于m,这可以通过首先取对数得到一个和然后将对数扩展为 x/m 的一阶来近似(即,设置 ln(1-x/n) ~ -x/n):

ln(P(n)) ~ ( 0 + -1/m + -2/m +... + -(n-1)/m ) = ( -n(n-1)/2m )

或者:

P(n) ~ e^{-n(n-1)/2m}

或者,鉴于n=10^6m=2^96

P(n) ~ e^{-1/100000000000000000} ~ 1

换句话说,你应该很好地使用随机随机数(给定单10^6个密钥的假设消息)。