Random-Number-Generator

密鑰和種子有什麼區別?

  • February 1, 2018

我總是聽說,如果您有種子,那麼您可以輕鬆獲得密鑰。那麼,密鑰通常只是種子的擴展版本嗎?如果是這樣,通過一些密鑰派生算法?

另外,如果你有了種子就可以很容易地得到密鑰,那我們為什麼不直接用種子作為秘鑰呢?

我懷疑您指的是偽隨機數生成器(PRNG)的操作。它將種子作為輸入,並產生一系列看似隨機的輸出。

如果您從 PRNG 的輸出中派生加密密鑰,則選擇的密鑰取決於種子。如果攻擊者知道種子,他們很可能能夠(更)更有效地猜出密鑰。

如果種子是使用隨機源創建的(與偽隨機源相比),那麼至少部分是不可預測的,並且 PRNG 的結果輸出也是不可預測的。如果你把種子扔掉(這樣它就不會在事後被偷走),你應該可以放心地使用密鑰。

你具體問:

那麼,密鑰通常只是種子的擴展版本嗎?如果是這樣,通過一些密鑰派生算法?

我想說雖然它的措辭有點奇怪,但您可能會將密鑰視為“種子的擴展版本”。該過程比僅通過密鑰派生算法稍微複雜一些,因為您省略了 PRNG。所以:種子 -> PRNG -> 密鑰派生算法 -> 密鑰

另外,如果你有了種子就可以很容易地得到密鑰,那我們為什麼不直接用種子作為秘鑰呢?

簡短的回答是,種子具有少量真正的隨機性,需要花費時間和精力才能獲得。相比之下,PRNG 非常快速/廉價地將該種子更改為顯著更多的偽隨機輸出。

您絕對可以使用種子(或者可能是一系列種子,因為您可能需要比一個種子包含的更多數據)作為數據源來生成您的密鑰。(seed1 + seed2 + seed3 + … + seedN) -> 密鑰派生函式 -> 密鑰,省略 PRNG。

沒有這樣做的原因是:

  • 真正的隨機(與偽隨機/PRNG 不同)源要慢得多且成本更高
  • 密鑰推導函式可能對輸入數據中的任何可預測資訊非常敏感。這意味著即使是部分可預測的輸入數據(例如您的種子)也是危險的。因此,您需要完全從緩慢、昂貴、真正的隨機源生成種子,而不是讓種子的一部分真正隨機。
  • 您需要大量數據,因此您需要的不僅僅是一顆種子。參見上文,與 PRNG 輸出相比,每一個都是昂貴的。

的秘鑰 $ n $ 位應包括 $ n $ 從隨機到對手無法區分的位。儘管種子可能包含適量的隨機性,但這並不意味著隨機性包含在 $ n $ 位;通常隨機性分佈在多個位上,其中一些位僅包含一些隨機性,甚至根本不包含隨機性。在這種情況下,你不能只是採取 $ n $ 種子中的位或對種子執行簡單的算術運算(例如將位異或在一起)。

因此,可以使用密鑰推導函式從種子中提取隨機性。如果輸入已經包含足夠的熵,那麼 KDF 通常是基於密鑰的 KDF 或 KBKDF。除此之外,還可以擴展來自 KDF 的密鑰材料的數量。然而,隨機性的數量不會增加,因此這主要用於從同一種子中提取更多的密鑰材料(例如 MACENC 密鑰或 ENC 密鑰和IV)。或者,KDF 可以在同一個種子上執行多次,其中密鑰還取決於附加數據(標籤或更一般的資訊)。一種也可以用作輸入,這樣更容易證明 KDF 的安全性。HKDF 是一個現代的 KBKDF,它清楚地區分了隨機性提取和擴展。

這樣的密鑰派生函式是偽隨機函式,因為如果您不知道種子,則輸出是隨機的。在 TLS 1.2 中缺少名稱密鑰派生函式或 KDF:取而代之的是更通用的 PRF 名稱。


請注意,通常偽隨機數生成器 (PRNG) 也被認為是 KDF。但是儘管它們非常相似,但我不會使用任何隨機數生成器來創建輸出密鑰材料。尤其是在實現隨機數生成器時,必須滿足不同的要求。例如,可能是隨機生成器更改了算法,或者它使用了額外的種子。在這種情況下,隨機數生成器的輸出會發生變化,因此會導致不同的密鑰。在最壞的情況下,您根本無法重新生成輸出密鑰材料,這意味著使用這些密鑰加密的任何消息也會失去。


種子通常也稱為輸入鍵控材料

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