AES的CBC模式指定爲了使每個消息具有唯一性,應該使用IV。 IV應該是隨機的,只能使用一次,否則它可能允許人們解密使用相同密鑰的其他密文。rand應該用於IV嗎?
C中的rand()
函數適合產生這個IV嗎?現在通常播種的事實是否會使它容易受到某種攻擊?
AES的CBC模式指定爲了使每個消息具有唯一性,應該使用IV。 IV應該是隨機的,只能使用一次,否則它可能允許人們解密使用相同密鑰的其他密文。rand應該用於IV嗎?
C中的rand()
函數適合產生這個IV嗎?現在通常播種的事實是否會使它容易受到某種攻擊?
快速回答是否。不要將非密碼安全的隨機生成器用於初始化向量。初始化向量未加密發送,所以可以認爲它們可以由這些函數之一生成。但是這會導致弱點,我會解釋一下:如果你使用窮人(並且rand()
就是這樣一個很弱的隨機例程),你會縮小你正在生成的可能IV的空間。舉一個例子就足夠了:
假設您在某些加密消息中使用了8字節的IV。但是你使用的隨機函數有一個8位的種子,只有256個可能的字節序列可以從這樣一個不好的隨機函數中產生,所以可能最多隻會產生256個可能的IV(即使它們表現出純粹的隨機性,或者是在整個空間上廣泛傳播的哈希值)攻擊者知道這一點,可以重現可能的IV的整個256空間,使它們完全無用。
IV以清晰的方式發送,因此攻擊者無需重現它。而一個8位的種子只能產生256個不同的數據流,在這些數據流中有一個未知的位置會產生更多可能的8個字節的子序列(儘管如果這個斷言是每次調用都會重新接入,那麼它只會是256) 。 – bartonjs
@bartonjs,IV是明確發送的,你是對的,但它有一個大小,並且必須由最大熵同等可能的比特組成。幾乎所有這些要求都由一個小的種子良好的熵隨機生成器來滿足,但是最後一個。如果種子只有8位,則最大熵不能達到,最多有256個IV,這完全沒有熵。如果種子被重新接種,那麼你使用的是什麼樣的產生?你是從另一個隨機發生器重新播種嗎?你看到我的方法嗎? –
對於CBC模式,IV需要不可預知。如果'rand'確實只使用當前時間作爲種子,那麼這可能不安全(取決於整個協議)。 –
否; rand()不是加密隨機的。如果你想要任何安全性,這是非常不可取的。它有可能只產生31位的僞隨機性,而這對於安全性來說是不夠的。 –
@JonathanLeffler我認爲它只是足夠隨機停止重播攻擊? –