密碼學中使用的密鑰是如何生成的?
在密碼學中似乎到處都有密鑰。從 HMAC 之類的東西到加密(非對稱和對稱)。
我現在不完全理解的一點是加密密鑰是如何生成的?我知道它們必須是隨機的,但這是所有必需的屬性嗎?
生成方法是否也因案例而異?例如,HMAC 中使用的密鑰與用作簽名一部分的密鑰的生成方法是否不同?
在進行一些Google搜尋時,我遇到了幾個與鍵和隨機數相關的術語。例如,PRNG、RNG、HKDF、VRF、PRP、PRF 等。
問題是,很難整合所有這些資訊來簡潔地回答我關於加密密鑰的問題。它們是如何產生的?什麼機制在密鑰生成中發揮作用,它們不僅僅是隨機數嗎?某些案例是否需要某些生成這些密鑰的方法?
密碼密鑰通常應在密碼系統的密鑰域中秘密且均勻地隨機生成;即在密碼系統的有效密鑰集中。使密鑰有效的因素取決於密碼系統和通常的參數(通常包括密鑰大小)。
在一些密碼系統中,包括大多數對稱密碼系統,有效密鑰集只是密鑰大小的比特串集,例如 AES-192 的 192 位。
非對稱密碼學中的事情更複雜。一個原因是它生成了一個密鑰對,包括一個秘密私鑰和一個匹配的公鑰。另一個原因是通常存在一些數學約束。例如,在ECDSA相對簡單的情況下,整數中的有效私鑰 $ d $ 在範圍內 $ [1,n-1] $ 在哪裡 $ n $ 是生成器的順序 $ G $ 橢圓曲線群,得到匹配的公鑰作為橢圓曲線點 $ Q:=d,G $ . RSA 的情況更複雜。
定義了密鑰域後,還有待解釋它是如何生成統一隨機密鑰的。最簡單的是公平擲硬幣,必要時重複(例如 AES-192 192 次)。我們是否需要在一個範圍內生成一個整數 $ [a,b] $ ,有多種方法可以從公平的硬幣拋擲中做到這一點。最簡單的就是生成 $ \left\lceil\log_2(b-a+1)\right\rceil $ 比特幣拋硬幣,將比特組裝成一個整數 $ x $ 根據大端二進制約定,計算 $ y=a+x $ , 如果 $ y\le b $ ,否則重複該過程。
這種方法可以使用加密強的隨機數生成器自動化,例如
/dev/urandom
在大多數 unix 風格中。有一些替代品,而是使用密鑰派生函式,從另一個密鑰計算密鑰,或者有時從一個難忘的密碼片語計算密鑰。