在不知道私鑰的情況下導出公鑰的密鑰
我正在尋找一種方便的方法來跨多個服務共享一組公鑰,同時通過防止這些服務將這些公鑰集的身份跨服務綁定在一起來保護隱私。
例如,如果我與服務 1 和服務 2 共享我的公鑰集,服務 1 和服務 2 應該不能一起工作以發現我在這兩個服務上都有一個帳戶。
請注意,我不想簡單地為每個服務生成一組新的密鑰對,因為出於安全原因(以避免單點故障),私鑰分佈在多個設備上,並在每個服務上生成一個新的密鑰對每次我想為新服務設置身份驗證時,這些設備都會給使用者帶來不便。
在考慮滿足這些要求的最佳方法時,我相信我已將問題簡化為以下內容:
給定一個公鑰 K pub和一些其他資訊 x,我想派生一個公鑰 K’ pub使得 K priv的持有者,並且只有給定 x 的密鑰持有者才能找到 K’ priv,這樣它給定 K’ pub和 x,很難找到 K pub 。
所以基本上,我似乎想要一個可以派生公鑰的密鑰派生函式,但在不知道一些額外的秘密資訊的情況下無法派生相應的私鑰。
這可能嗎?是否有滿足上述要求的現有解決方案?還是我在這裡開闢新天地?
我相信BIP32做了你所描述的事情,並且是我所知道的這種方案的最佳文件實現,並且有很大的動機來攻擊它。
總體而言,這種模式通常被稱為“分層確定性”方案或“分層確定性錢包”(因為它通常用於加密貨幣)。我已經收集到它適用於各種不同的 ECDSA 曲線,也可能適用於 EdDSA,但我否認對具體細節有任何個人知識。
對於公鑰加密,有一個使用 Elgamal 變體的簡單解決方案。(如果要進行身份驗證,可以使用標準算法。如果您特別想要簽名方案,請說出來。)
回想一下 Elgamal 的安全性等價於 DDH,它是在談論某些子群的不可區分性,即給定一個循環群 $ G $ , 一個(任意)生成器 $ g $ 和組的一個元素 $ y $ , 決定對 $ (x,z) $ 位於的子群中 $ G \times G $ 由對生成 $ (g, y) $ .
我們可以將 Elgamal 表述如下: 使用公鑰進行加密 $ (g,y) $ , 選擇一個隨機數 $ r $ , 計算 $ x=g^r $ , $ z=y^r $ 和 $ w = zm $ . 密文是對 $ (x,w) $ .
決定是否 $ (x,w) $ 是一種加密 $ m $ 相當於決定是否 $ (x,w/m) $ 位於子群中。
現在觀察如果 $ (g,y) $ 是公鑰,那麼 $ (g’,y’) = (g^b,y^b) $ 就像一把鑰匙一樣好。
最後,決定是否 $ (g’,y’) $ 和 $ (g’’, y’’) $ 表示同一個公鑰相當於決定一個是否在另一個生成的子組中。
您用於提高 Elgamal 安全性的大多數技巧也適用於此變體,即使使用隨機密鑰也是如此。
稍加思考,我相信你可以想出這個一般想法的很多變體。