rand应该用于IV吗?

rand应该用于IV吗?

问题描述:

AES的CBC模式指定为了使每个消息具有唯一性,应该使用IV。 IV应该是随机的,只能使用一次,否则它可能允许人们解密使用相同密钥的其他密文。rand应该用于IV吗?

C中的rand()函数适合产生这个IV吗?现在通常播种的事实是否会使它容易受到某种攻击?

+1

对于CBC模式,IV需要不可预知。如果'rand'确实只使用当前时间作为种子,那么这可能不安全(取决于整个协议)。 –

+4

否; rand()不是加密随机的。如果你想要任何安全性,这是非常不可取的。它有可能只产生31位的伪随机性,而这对于安全性来说是不够的。 –

+0

@JonathanLeffler我认为它只是足够随机停止重播攻击? –

快速回答是。不要将非密码安全的随机生成器用于初始化向量。初始化向量未加密发送,所以可以认为它们可以由这些函数之一生成。但是这会导致弱点,我会解释一下:如果你使用穷人(并且rand()就是这样一个很弱的随机例程),你会缩小你正在生成的可能IV的空间。举一个例子就足够了:

假设您在某些加密消息中使用了8字节的IV。但是你使用的随机函数有一个8位的种子,只有256个可能的字节序列可以从这样一个不好的随机函数中产生,所以可能最多只会产生256个可能的IV(即使它们表现出纯粹的随机性,或者是在整个空间上广泛传播的哈希值)攻击者知道这一点,可以重现可能的IV的整个256空间,使它们完全无用。

+0

IV以清晰的方式发送,因此攻击者无需重现它。而一个8位的种子只能产生256个不同的数据流,在这些数据流中有一个未知的位置会产生更多可能的8个字节的子序列(尽管如果这个断言是每次调用都会重新接入,那么它只会是256) 。 – bartonjs

+0

@bartonjs,IV是明确发送的,你是对的,但它有一个大小,并且必须由最大熵同等可能的比特组成。几乎所有这些要求都由一个小的种子良好的熵随机生成器来满足,但是最后一个。如果种子只有8位,则最大熵不能达到,最多有256个IV,这完全没有熵。如果种子被重新接种,那么你使用的是什么样的产生?你是从另一个随机发生器重新播种吗?你看到我的方法吗? –