Chacha

ARC4random – 基於 ChaCha 的 LibreSSL PRG

  • February 28, 2016

這是來自 OpenBSD 中使用的 LibreSSL 偽隨機生成器的arc4random.c

它的工作原理如下:

  1. 從作業系統(PRG 種子)中獲取 40 個“真正隨機”字節;
  2. 以種子為密鑰,IV生成1024字節的ChaCha密鑰流;
  3. 使用keystream的最後984字節作為PRG輸出,前40字節作為key和IV生成ChaCha keystream的下一個1024;
  4. 重複直到密鑰流字節總數超過限制;之後重新播種(轉到步驟 1)。

我不太明白第 3 步的目的(參見連結程式碼的第 135-138 行):

/* immediately reinit for backtracking resistance */
_rs_init(rsx->rs_buf, KEYSZ + IVSZ);
memset(rsx->rs_buf, 0, KEYSZ + IVSZ);
rs->rs_have = sizeof(rsx->rs_buf) - KEYSZ - IVSZ;

為什麼不使用整個密鑰流作為 PRG 輸出?為什麼“重新加密”步驟使 PRG 更安全?

這是為了防止兩種不同類型的攻擊。

  1. 偏見攻擊。將來可能會像 RC4 一樣破壞 ChaCha20,並且只有給定足夠部分的密鑰流,您才能恢復密鑰(或等效的東西)。通過頻繁地重新鍵入密鑰,您可以限制每個給定密鑰的密鑰流的長度,從而使這些攻擊變得不可能。
  2. 狀態恢復攻擊。假設攻擊者在某個時間點了解 PRNG 的狀態。現在雖然他仍然可以預測未來的位,但他將無法預測最後一次重新密鑰之後的過去位,因為執行此操作所需的密鑰已經消失並且您無法從目前密鑰中恢復它(如果可以您可以從密鑰流的一小段中被動地恢復密鑰)。

引用自:https://crypto.stackexchange.com/questions/33191