Wallet

比特幣核心錢包如何為 HD 種子生成熵?

  • February 6, 2022

比特幣核心錢包如何為 HD(分層確定性)種子和最終的私鑰生成熵?

這篇文章提出了一個相關問題,但不關注熵部分,更多的是 BIP 32/39 部分。

比特幣核心錢包需要熵來生成 HD 種子和生成數字簽名(由 secp256k1 庫處理)中使用的隨機數(使用一次的數字)。

raw_avocado 在Twitter 上討論了 Bitcoin Core 錢包如何為 HD 種子生成熵。總之,通過混合來自 4 個主要來源的熵:低級處理器指令、來自作業系統的熵、動態事件和靜態事件。

(i) 處理器指令

RDSEED - 訪問處理器上的內置真隨機數生成器。

RDRAND - 訪問每次使用 RDSEED 呼叫時都會播種的內置偽隨機數生成器

RDTSC - 返回復位後的 CPU 週期數

(ii) 作業系統來源

大多數 Linux 發行版都有呼叫 /dev/urandom 的特定函式,例如 getrandom,但不是直接呼叫它。

getentropy 用於 Open BSD 和 Mac sysctl kern.random on Free & Net BSD

Windows 上的 CryptGenRandom。

(iii) 動態事件

各種時鐘被稱為實時、單調和啟動時間。

資源使用在不斷變化,是熵的重要來源。

在 Windows 上,呼叫 getrusage,在 Linux 上使用來自 /proc 的偽文件或 sysctl(如果可用)。

(iv) 靜態事件

從編譯器版本到比特幣客戶端版本到 CPUID、主機名、網路介面、核心資訊、文件系統數據的靜態詳細資訊。

即使事件靜態和動態是非加密數據,它們仍然會增加熵。

動態和靜態事件(大部分)是通過使用<<左移位來混合的。因為它是二進制運算,所以每個數字都是 2 的冪,所以移動位 n 位置最終乘以2^n。當一次使用多個數字時,這會進一步增加混亂。用於混合熵的最常用方法是 SHA512(它的壓縮函式更精確)。SHA512 可以作為偽 RNG 有效地工作,因為它顯示出一致性,這意味著每個輸出具有相同的發生機率。在某些情況下,使用 SHA256。

好的散列函式具有很強的雪崩效應,這意味著即使增加單個輸入位,每個輸出位也會以 50% 的機率發生變化。位擴散是輸入塊添加、旋轉和異或的結果。

在這種混合情況下,處理器 pseudoRNG RDRAND 的結果被異或 1024 次。(這用作 RDSEED - TRNG 的備份)。每次呼叫都應該以不同的方式重新植入 PRNG,XORing 是一種混淆事物的好方法。

另一種增強熵的技術是在一個循環中對輸入進行雜湊處理一段時間,而不僅僅是多次。對混合技術進行了基準測試,並且基準也作為熵的來源混入。隨著每個熵源和每個混合,對手重新創建熵的機會呈指數下降。即使一些來源以某種方式受到損害,最終仍會產生一個安全的密鑰。

引用自:https://bitcoin.stackexchange.com/questions/112218