是否存在可以对用户进行身份验证(或者他们可以解锁文档)的加密系统,只有当他们提供多个有效密钥的子集时才会进行身份验证?
提前致谢。
答案 0 :(得分:0)
如果您不要求有助于成功身份验证的用户保持匿名,那么很简单:服务器会生成一个随机的nonce并将其发送给用户子集。每个用户使用他/她的私人签名密钥对nonce进行签名,并将签名发送给服务器。服务器验证每个签名,如果存在足够的签名,则该子集已成功通过身份验证。
此处的其他人可能知道用于此目的的RFC或库,但如果没有,我会像这样设计:将秘密拆分为n
部分,其中k
是使用Shamir's Secret Sharing重新创建秘密所必需的。对于每个n
用户,使用他/她的公共加密密钥加密拆分秘密的不同部分。当k
他们解密他们分离秘密的部分时,他们可以重新创建秘密。
如果公钥加密是确定性的,您甚至可以将其设为匿名,如果您可以获得秘密,您可以检查k
用户的每个其他子集是否也能够获取秘密:在准备协议运行时,除了公共加密密钥之外,还必须为每个用户指定固定的x坐标。当用户子集成功重建秘密并因此重新创建多项式时,他们可以在每个用户x坐标处对其进行评估,并使用其公钥对其进行加密。如果结果与服务器生成的结果相同,则k
个用户的每个子集都可以解密该密钥。
(请注意,确定性加密有一些注意事项。例如,如果明文空间很小,攻击者只能加密每个明文并将结果与给定的密文进行比较。)
使用匿名解密,您可以通过让服务器以上述方式加密k
个n
人的随机nonce来创建匿名身份验证协议,并将其发送给用户子集。他们解密nonce,检查k
个用户的每个子集是否也能解密它并将该nonce发送回服务器。