Implementation
為什麼 Fortuna 熵池在重新播種後會重置?
我已經實現了 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 庫.
可以重新輸入收集到的熵(此處
tmp
為sha256_done
)。那會更複雜,也更慢。最重要的是,Fortuna 的安全原理沒有必要,它在池之外具有足夠大的狀態。同一構想的另一個論點:使用標準 SHA-256 庫,沒有辦法保存和恢復雜湊的狀態(除了保存整個輸入),而我們可能想要保存 Fortuna 的狀態(如盡可能緊湊)。