Implementation

為什麼 Fortuna 熵池在重新播種後會重置?

  • April 10, 2014

我已經實現了 LibTomCrypt 的 fortuna 版本,並且想知道重新播種後池的重置。在 libtomcrypt 的 fortuna.c 中,我們有以下內容(這是將池中的熵添加到密鑰中的部分),

for (x = 0; x < LTC_FORTUNA_POOLS; x++) {
 if (x == 0 || ((prng->fortuna.reset_cnt >> (x-1)) & 1) == 0) { 
     /* terminate this hash */
     if ((err = sha256_done(&prng->fortuna.pool[x], tmp)) != CRYPT_OK) {
        sha256_done(&md, tmp);
        return err; 
     }
     /* add it to the string */
     if ((err = sha256_process(&md, tmp, 32)) != CRYPT_OK) {
        sha256_done(&md, tmp);
        return err;
     }
     /* reset this pool */
     if ((err = sha256_init(&prng->fortuna.pool[x])) != CRYPT_OK) {
        sha256_done(&md, tmp);
        return err;
     }
  } else {
     break;
  }
}

一旦池被添加到密鑰中,它就會被重置,這是為什麼呢?我意識到此時熵已包含在密鑰中,因此已使用它,但是為什麼不繼續向池中添加熵並讓它從一開始就保留所有熵呢?如果池不重置有什麼缺點嗎?

正如izaera所指出的,池的重置是在Fortuna中明確指定的,而不是實現工件。

Fortuna 中的池是 SHA-256 雜湊。根據定義,為了獲得池的結果,必須獲得 SHA-256 雜湊(在目前程式碼中,這是 的工作sha256_done)。使用標準的 SHA-256 實現,在獲得結果後無法繼續進行雜湊(例如,在執行另一個雜湊之前sha256_process可能會失敗)。我沒有檢查 LibTomCrypt 中是否是這種情況,但在.sha256_done``sha256_init``java.security.MessageDigest

這為“重置池”提供了動力:從頭開始重新啟動池/SHA-256 是與獲取雜湊和使池能夠再次收集熵兼容的最簡單選項,允許使用標準 SHA-256 庫.

可以重新輸入收集到的熵(此處tmpsha256_done)。那會更複雜,也更慢。最重要的是,Fortuna 的安全原理沒有必要,它在池之外具有足夠大的狀態。


同一構想的另一個論點:使用標準 SHA-256 庫,沒有辦法保存和恢復雜湊的狀態(除了保存整個輸入),而我們可能想要保存 Fortuna 的狀態(如盡可能緊湊)。

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