AES-256 密鑰/IV 對儲存在 wallet.dat 文件的什麼位置?
我創建了一個加密的比特幣文件。我知道密碼,並且在十六進制轉儲中看到了 mkey。我想知道 AES 密鑰/IV 對在 wallet.dat 文件中的位置?
需要注意的重要一點是,wallet.dat 文件沒有完全加密,只有私鑰加密。每個私鑰也有自己的 IV,而不是整個錢封包件的 IV。
記錄的值組件
mkey
包含加密的 AES 密鑰、鹽、推導方法、推導迭代次數和其他推導參數。這將採用以下形式:<encrypted AES key length> <encrypted AES key bytes> <salt length> <salt bytes> <32-bit int derivation method> <32-bit int number of derivations> <other parameters length> <other parameters bytes>
長度使用比特幣的緊湊大小無符號整數格式進行編碼。
例如,這是
mkey
來自錢包的記錄:3051608a94fc01faba1d49d4bda9e25ea46757e5c131f47a67d0f1873a9e02481db575e08a1ad20958caf6c4c69529deb7082ce050702dd2bc0700000000bcb8040000
加密的 AES 密鑰的長度為
30
. 加密的 AES 密鑰是51608a94fc01faba1d49d4bda9e25ea46757e5c131f47a67d0f1873a9e02481db575e08a1ad20958caf6c4c69529deb7
. 鹽的長度是08
,鹽是2ce050702dd2bc07
。推導方法為00000000
,迭代次數為bcb80400
。其他參數的長度為00
,因此其他參數沒有剩餘字節。為了獲得用於錢包私鑰的實際 AES 密鑰,錢包的密碼用於構造用於加密 AES 密鑰的密鑰。唯一的推導方法(由記錄
00000000
中的表示mkey
)將密碼片語與鹽連接起來,並使用 SHA512 對其進行雜湊處理。散列的次數取決於儲存的迭代參數。該散列的前 32 個字節是用於加密 AES 密鑰的密鑰。接下來的 16 個字節是它的 IV。剩餘的 16 個字節被丟棄。該計算密鑰用於解密用於實際私鑰的 AES 密鑰。這些私鑰的 IV 是密鑰公鑰的 SHA256 的前 16 個字節。
我想比特幣核心原始碼可能是 wallet.dat 文件佈局的一個很好的指南。您可能需要找到創建(或最後寫入)wallet.dat 文件的特定版本的比特幣核心的來源。
還有<https://en.bitcoin.it/wiki/Wallet>可以為您提供各種資源。
該文件的格式為 Berkeley DB。可以操作錢封包件的工具包括 pywallet。