Protocol-Design

可以更改秘密的秘密共享方案

  • March 19, 2015

這是我想使用秘密共享方案處理的場景:

  1. 愛麗絲想分享這個秘密 $ S $ 鮑勃、查理和戴夫。Alice 生成私有共享 $ S $ Bob、Charlie 和 Dave,並通過安全渠道將它們傳達給他們的目標接收者。
  2. Alice 生成一個參數 $ P $ 基於 $ S $ 並發表。
  3. Bob、Charlie 和 Dave 中的每個人都可以使用 $ P $ 和他們的個人份額。夏娃無法重建它,即使她知道 $ P $ .
  4. 愛麗絲需要更改秘密。Alice 只重新計算一個新的 $ P $ . 參與者的所有私人股份保持不變。
  5. Bob、Charlie 和 Dave 中的每個人都可以使用新的公共參數重建新的秘密 $ P $ .
  6. Alice 想要添加一個新參與者Fred 並從組中刪除參與者Bob。Alice 重新計算一個新的 $ P $ 以及 Fred 的新私人股份。
  7. 查理、戴夫和弗雷德每個人都可以使用他們的股份和新的 $ P $ . Bob 無法使用新的 $ P $ .

是否有一些秘密共享方案可以處理這種情況?我發現自己有一些秘密共享方案,例如Shamir 的秘密共享使用中國剩餘定理的秘密共享,但這些方案並不能滿足我的所有要求。

基本上,使用一堆獨立的一次性墊。

我將使用數組切片,其中數組

$$ x:y $$返回長度為 yx 的子數組,該子數組

由從包含 x 到不包含 y 的條目組成。

k = computational_security_parameter
L = length_of_the_secret
n = number_of_changes_at_which_you_lose_information-theoretic_security
userinfo = [["Bob",Bob's_share],["Charlie",Charlie's_share],["Dave",Dave's_share]]

define makeparameterfor(m,userinfo,secret):
P = [m]
if m < n:
 for [name,share] in userinfo:
  append [name,(share[m*L:(m+1)*L] xor secret)] to P
else:
 for [name,share] in userinfo:
  append [name,enc(share[n*L:(n*L)+k],secret)] to P
return P

countervalue = 0

define generateparameter(userinfo,secret):
return makeparameterfor(0,userinfo,newsecret)

define reconstruct(username,usershare,parameter):
namefound = False
for entry in parameter:
 if entry[0] == username and length(entry) != 1:
  [name,ctext] = entry
  namefound = True
 break
if namefound == False:
 throwexception("invalid reconstruction attempt")
else:
 cv = parameter[0]
 if cv < n:
  return ctext xor share[cv*L:(cv+1)*L]
 else:
  return dec(share[n*L:(n*L)+k],ctext)

define changesecret(userinfo,newsecret):
countervalue = max(n,countervalue+1)
return makeparameterfor(countervalue,userinfo,secret)

define addnewuser(oldparam,secret,name,share):
append [name,share] to userinfo
cv = oldparam[0]
newP = oldparam
if cv < n:
 append [name,(share[cv*L:(cv+1)*L] xor secret)] to newP
else:
 append [name,enc(share[n*L:(n*L)+k],secret)] to newP
return newP

define removeuser(username,oldparam):
for [name,share] in userinfo:
 if name == username:
  remove [name,share] from userinfo
newP = [oldparam[0]]
for [name,ctext] in oldparam:
 if name != username:
  append [name,ctext] to newP
return newP

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