這是將私鑰拆分為 2 of 3 方案的好方法嗎?
基本上,這個想法是將密鑰分成三個部分( $ key_a, key_b, key_c $ ) 其中 3 個部分中的任何 2 個可用於重新創建原始密鑰
$ key_a $ : 一個小於我們原始密鑰的隨機數
$ key_b $ :另一個數字,當添加到 $ key_a $ 將導致原始密鑰
$ key_c $ :兩個組件:
- $ xor_a $ : 原始密鑰的異或 $ key_a $
- $ xor_b $ : 原始密鑰的異或 $ key_b $
這是將私鑰拆分為 2 of 3 方案的好方法嗎?
這是一個 Github 要點,顯示了我上面描述的 Python 範例。
提議的共享方案確實允許重建密鑰 $ K $ 從三股中的任意兩股 $ K_A $ , $ K_B $ , $ K_C=(X_A,X_B) $ , 因為:
- $ K=K_A+K_B $ 從 $ K_A $ 和 $ K_B $
- $ K=K_A\oplus X_A $ 從 $ K_A $ 和 $ K_C $
- $ K=K_B\oplus X_B $ 從 $ K_B $ 和 $ K_C $
問題是,該方案洩露了關於密鑰的資訊 $ K $ : 對參與者來說總是不到 1 比特的價值 $ A $ 和 $ B $ ; 但超過 1 位參與者 $ C $ , 長大到整個 $ K $ 如果有足夠的冗餘 $ K $ (見下文)。雖然提議的共享方案可能會洩漏關於 RSA 或 ECDSA 密鑰的私有指數的可接受的少量資訊,這些資訊足夠接近均勻隨機,但通常不推薦。
舉個極端的例子,如果它共享一個密鑰 $ K $ 一點點,也就是 $ K\in{0,1} $ , 然後:
如果 $ K=0 $ 然後 $ K_A=0 $ , $ K_B=0 $ , $ K_C=(X_A,X_B)=(0,0) $
如果 $ K=1 $ 然後要麼
- $ K_A=0 $ , $ K_B=1 $ , $ K_C=(X_A,X_B)=(1,0) $
- $ K_A=1 $ , $ K_B=0 $ , $ K_C=(X_A,X_B)=(0,1) $
它遵循 $ C $ 總是學習 $ K=X_A\oplus X_B $ , 和 $ A $ 或者 $ B $ 看到它 $ K_i=1 $ 學習 $ K $ ; 另外,如果 $ K $ 是統一的, $ A $ 和/或 $ B $ 看到它 $ K_i=0 $ 可以打賭 $ K=0 $ 賠率高於偶數。
對於大 $ K $ , $ A $ 和 $ B $ 了解有關數量級的一些資訊 $ K $ (平均不到 1 位,無論分佈如何 $ K $ ).
但 $ C $ 獲得更多關於 $ K $ . 的低位 $ X_A\oplus X_B $ 總是的低位 $ K $ ,以及的高位 $ X_A\oplus X_B $ 傾向於匹配相應的位 $ K $ 為均勻分佈 $ K $ .
更糟糕的是,已知存在冗餘 $ K $ 允許 $ C $ 獲得更多關於 $ K $ . 例如,如果已知 $ K $ 完全由某些基數中的數字 0 和 1 組成 $ 2^j $ 和 $ j\ge3 $ 包括十六進製或八進制,然後 $ C $ 可以完全重構 $ M $ 通過計算 $ (X_A+X_B)\oplus(2(X_A+X_B)) $ 並屏蔽以保留可以設置的位 $ K $ .
一個有效且不洩漏資訊的簡單方案是共享每一位 $ k $ 的 $ K $ 通過分配一個均勻隨機的整數 $ x $ 在 $ {0,1,2} $ 至 $ A $ ; $ x+k\bmod3 $ 至 $ B $ ; $ x+2k\bmod3 $ 至 $ C $ . 如果兩方分配了相同的值,則 $ k=0 $ , 否則 $ k=1 $ .
此外,通過寫 $ K $ 以三為底,因此與 $ k\in{0,1,2} $ ,並且當事方知道誰收到了 $ x $ , $ x+k\bmod3 $ , 或者 $ x+2k\bmod3 $ , 方案的容量增加並且三個份額中的每一個都具有相同的大小 $ K $ .
當然,通用的方法是Shamir的秘密共享,它允許靈活的共享數量和重構門檻值 $ K $ .