這種使用分層確定性密鑰的密鑰撤銷方案可以工作嗎?
假設我正在使用支持分層確定性密鑰生成的加密,使用 secp256k1 的比特幣/乙太坊密鑰就是一個例子。
有一個分散的密鑰系統資料庫,使用者註冊他們的公鑰以供使用,其他使用者檢索這些公鑰進行驗證。類似的設置可能是使用者將硬幣轉移到其他人的公鑰的區塊鏈。
現在我想支持密鑰撤銷,就像使用者的私鑰被盜一樣,他可以撤銷相應的公鑰。這個想法是使用者使用分層確定性密鑰生成。父密鑰可能在冷藏庫中受到嚴密保護,其子密鑰用於正常使用。它是放在系統資料庫上的子公鑰。您使用父(私有)密鑰的知識來證明對系統資料庫的子密鑰的控制並要求系統資料庫撤銷子密鑰。系統資料庫將驗證子密鑰確實是從父密鑰派生的(可以使用this完成),並且撤銷者擁有父私鑰。
例如。Alice 生成一個父密鑰對 $ A $ 用秘密和公共密鑰作為 $ A_s $ 和 $ A_p $ 分別它從不單獨用於子密鑰生成並保存在非常安全的儲存中。現在,每當 Alice 想要創建一個新的子密鑰時,它都會使用父密鑰 $ A $ . 說它基於密鑰對的 2 個子密鑰 $ A1 $ ( $ A1_s $ , $ A1_p $ ) 和 $ A2 $ ( $ A2_s $ , $ A2_p $ )。現在它失去了包含 $ A1 $ 和 $ A2 $ . Alice 不會使用私鑰向系統資料庫提供簽名 $ A_s $ 並要求登記處撤銷 $ A1 $ 和 $ A2 $ . 系統資料庫檢查 $ A1 $ 和 $ A2 $ 來源於 $ A $ 並因此撤銷。
更新:
正如下面的答案所示,該方案沒有用,因為撤銷子密鑰可以使任何子私鑰的擁有者知道父私鑰。
我可以預見到這樣一種方案的一個問題是,當您知道父擴展公鑰和任何從它繼承的非硬化私鑰時,您可以輕鬆計算父擴展私鑰。
這是真的,因為非硬化公鑰的形式為:
I = HMAC-SHA512(Key = c par , Data = ser P (point(k par )) || ser 32 (i))
然後將 I 拆分為兩個 32 字節序列,即 I L和 I R
以及子密鑰k i是:解析256 (I L ) + k par (mod n)
鏈碼 c i是 I R,它是擴展公鑰的一部分,
最後您可以通過計算點來計運算元公鑰(解析256 (I L )) + K par
或通過計算點(k i),兩者是等價的
因此,如您所見,子私鑰是父私鑰加上計算的 HMAC-SHA512 的 256 位,使用父私鑰的鏈碼(不是秘密)作為 HMAC 密鑰,重要的是,散列對應於擴展父私鑰的公鑰****以及子密鑰索引。
這基本上意味著攻擊者竊取非強化私鑰(然後您想使用父私鑰撤銷以向系統資料庫進行身份驗證)可以看到您用於向系統資料庫進行身份驗證的擴展公鑰,如果這是公開的,並從那裡派生您用來向伺服器進行身份驗證的父私鑰。
現在,攻擊者和系統資料庫都可以使用以下方法從擴展的父公鑰中派生子公鑰:
I = HMAC-SHA512(Key = c par , Data = ser P (K par ) || ser 32 (i))
然後將 I 拆分為兩個 32 字節的序列,I L和 I R
子密鑰 K i是 point(解析256 ( IL )) + K par,就像上面一樣。
但這也意味著攻擊者可以計算索引值“解析256 ( IL )”並將其減去子非硬化私鑰(她竊取)以恢復父私鑰:
k par = k i - 解析256 (I L ) (mod n)
從而有效地允許攻擊者撤銷從系統資料庫上的該父密鑰派生的所有其他子密鑰。
一種解決方法可能是說,當您在系統資料庫上註冊時,對於每個子密鑰,您註冊一個不同的父公鑰(這將是一個強化密鑰),然後可以使用該密鑰來撤銷該子密鑰,但只有那個子鍵…
與擁有證書來簽署您的密鑰並允許您通過PGP撤銷它們相比,我不相信這會減輕痛苦,但使用這種方法,至少您只使用 HD 密鑰,正如您所希望的那樣。
所以,最後,只要你注意正確處理這個警告,這可能會起作用。