Protocol-Design

當秘密不是數字而是聲明時,如何使用秘密共享方案?

  • January 31, 2022

我想使用一個秘密共享方案,每個玩家 $ i\in N $ 不得不分享一對秘密 $ (l_i,\nu_{l_i}) $ , 在哪裡 $ l_i $ 是每個玩家的唯一程式碼(正整數),但是 $ \nu_{l_i} $ 是一個秘密,就像一個聲明。例如當玩家 $ i $ 向其他玩家報告 $ \nu_{l_i} $ 就像做一個“我的名字是 $ i $ 我知道資訊 $ \nu_i $ 。”

我最初的想法是我需要一個多項式函式 $ k-1 $ 為每一位玩家 $ i $ 分享程式碼 $ l_i $ 與其他玩家 $ j=-i $ , 但是知道 l_i 必然意味著另一個玩家也會學習 $ \nu_{l_i} $ 重構程式碼後 $ l_i $ . 我怎樣才能通過秘密共享來完成這項工作?

最簡單的解決方案是:

  1. 將秘密片語編碼為一個或多個數字,以及
  2. 然後使用秘密共享方案共享這些數字中的每一個。

事實上,如果您的密碼片語儲存在電腦上,那麼第一部分已經處理完畢:電腦通常將數據(包括文本)儲存為 8 位字節序列,即從 0 到 255 的數字。

只要您不需要生成超過 255 份的任何秘密,您就可以將這些字節視為 GF(2 8 ) 的元素並使用Shamir 的秘密共享方案(或您喜歡的任何其他類似的秘密共享方案)共享它們)。

您甚至可以安全地使用相同的共享 ID(即 $ x $ 座標)用於共享片語的每個字節,這樣您的共享只會比秘密片語長一個字節。(不過,它們將是隨機二進制數據,因此您可能需要對它們進行Base64編碼,以便將它們作為文本傳輸。)而且 Shamir 在 GF(2 8 ) 上的秘密共享可以非常快,因為所有的數學運算都只使用單個字節。由於這些原因,Shamir 的秘密共享的相當多的實現就是這樣做的。

上面描述的逐字節共享方法確實有一些缺點:

  1. 它揭示了秘密片語的字節長度。如果這是一個問題,則應該在共享之前以某種方式將片語可逆地填充到固定長度。
  2. 出於數學原因(即因為每個共享都需要一個不同的非零欄位元素作為其 $ x $ 座標)它不能用於為每個秘密生成超過 255 個不同的共享。如果這還不夠,您可以例如將共享拆分為字節並使用 Shamir 的方案在 GF(2 16 ) 上共享最多 65535 個共享,或者將其拆分為四個字節的組並通過 GF(2 32 ) 最多約 400 萬股。

(當然,如果您願意,您可以使用更大的欄位大小,甚至不是 2 的冪的大小。 但通常沒有理由這樣做,至少在共享二進制數據時不會這樣做,因為所有數據都儲存在二進製文件中電腦最終是。)


當然,如果您不堅持完美的資訊論安全性,另一個實用的選擇是為對稱加密方案(如AES )生成隨機密鑰(例如 128 或 256 位) ,* 使用密鑰加密您的秘密,然後共享密鑰。

如果您的實際秘密很長(例如,影片文件)並且您可以在某個共享頻道上發布加密的秘密,這可能是有利的,因為那時您需要單獨發送給每個股東的唯一內容就是他們的份額密鑰(只有幾個字節長)。


*) 當然,使用安全的操作模式。我通常會推荐一種經過身份驗證的加密模式,如 SIV,但即使是經典的非身份驗證模式,如 CBC 或 CTR,也可能足以滿足您的需求。只是不要使用歐洲央行。

引用自:https://crypto.stackexchange.com/questions/98455