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