我正在设计一个钱包,在那里可以分发任意数量的公钥。比如说,爱丽丝拿出公钥来接收信息。她不希望其他人能够将所有的公钥链接到同一个人。他们每个人看起来都是随机的,所以分发N个公钥会让旁观者相信有N个不同的人。
我知道,这可以通过拥有一个主私钥p_0来完成,并使用类似于p_{i+1} = \text{Hash}(p_i, p_0)的东西生成未来的私钥。然而,为了解密消息,Alice必须尝试每一个私钥。我是在浏览器中这样做的,使用ECC的JS测试似乎表明,一旦有了十几个键,UI的速度就会慢一些,但如果Alice可以等待一秒钟(虽然不是理想的),它是可行的。如果您试图一次解密数十条消息,那么使用太多的私钥,这很快就变得不可能了。至少在我的情况下,我必须尝试解密许多消息。
我真正想要的是,只需拥有一个私钥和任意数量的所需公钥。大多数密码系统都有特定的密钥对。虽然您可以简单地连接一个组的公钥以获得N个私钥:1公钥(解密需要每个人),但似乎没有众所周知的算法来获得1个私钥:n个公钥。
提到的这里示例没有帮助,因为如果解密需要ECC乘法,它们都太慢了。
==
QA格式:我希望在这个SE上找到一个解决方案,因为这个问题看起来并不复杂,但无法解决。无论如何,我在这里提出这个问题是为了帮助其他人/那些有兴趣的人,因为我觉得这个问题挺好的。
发布于 2018-11-30 23:33:23
以下是一个想法:
来自Alice的两个不同的公钥是不可链接的,因为唯一的连接是,它们包含使用相同AES密钥的两个不同值的加密,这与随机无法区分。
而且,所有操作都需要时间,与Alice生成的公钥数无关.
(注意:您将使用AES的一些身份验证加密模式,例如AES-GCM.)
发布于 2018-11-28 19:31:56
将HashToPoint(Number) -> Point定义为一个函数,该函数将整数映射到ECC点的均匀分布(这很容易通过散列来获得x坐标,并递增x直到到达x^3+ax+b为二次剩余的点,并给出一个具有所需顺序的点)。
让鲍勃生成一个主私钥a。
要生成一个新的公钥,可以生成一个随机整数r (在我的例子中是64位),并计算A = a\text{HashToPoint}(r)。广播(A, r)。
若要发送到Alice的公钥(A, r),请遵循标准DH。生成一个随机私钥t,并计算T = t\text{HashToPoint}(r)。将S = tA保存为共享秘密,并广播(T, \text{Hash}(S))。
现在,Alice只能计算S = aT一次,并且具有共享的秘密。她根据广播散列检查哈希,以知道它是发送给她的(或者,她可以简单地注意到,试图解密会产生随机字节)。无论发送方使用什么(A_i, r_i),此公式都有效。
窃听者无法知道谁收到了消息,因此消息内容和接收者身份是安全的。
现在O(n)接收算法是O(1),发送仍然是O(1)。
https://crypto.stackexchange.com/questions/64395
复制相似问题