问题:
A公司有他们不愿透露给B公司的秘密数据。 B公司拥有他们不愿透露给A公司的秘密数据。
秘密数据是双方的IP地址。
但两家公司想知道他们拥有的重叠IP数量(两家公司在数据库中拥有的IP地址)。
在没有使用第三方的情况下,如果没有一方妥协他们的秘密数据集,我就无法想出解决此问题的方法。是否有任何类型的哈希算法可以解决这个问题?
答案 0 :(得分:1)
首先,我将描述一个简单但不太安全的想法。然后我将描述一种方式,我认为它可以很容易地变得更加安全。基本的想法是让每个公司向另一家公司发送单向函数编码。
作为一个热身,我们首先假设一家公司(比如说A)以某种语言开发一个普通的计算机程序并将其发送给B;然后B将运行它,提供自己的电子邮件地址列表作为输入,程序将报告它们中也使用了多少个电子邮件地址。此时,B知道它与A共享的电子邮件地址的数量。然后,流程可以重复,但A和B的作用相反。
以普通编程语言直接实现此程序将产生一个几乎很容易进行逆向工程的程序。为了缓解这种情况,首先,不要让程序直接报告计数,让我们将问题重新表述为决策问题:另一家公司是否在输入中至少有k个电子邮件?(这涉及选择一些值来测试;当然,如果双方都同意,那么可以对许多不同的k值执行整个过程。(但是请参阅最后一节以了解可能的分支。))现在程序可以代表为SAT instance作为输入(一些位串编码)的电子邮件地址列表,并输出一个位,指示其中是否有k个或更多也属于创建该实例的公司。
向SAT实例提供输入并读取输出位在计算上很容易,但是当实例很大时,(原则上)很难进入“另一个方向” - 也就是说,找到一个满足输入的分配,即将输出位驱动为1的电子邮件地址列表:SAT是NP难问题,所有已知的精确技术在问题大小上都需要时间指数。
[编辑:实际上有多个很多多个(n选择k)可能的哈希值要一起进行OR运算,因为任何有效的子序列(允许有间隙)在包含至少k个共享的电子邮件地址列表中,需要打开输出位。如果每个电子邮件地址最多占用b位,则存在多于2 ^((n-k)b)*(n选择k)的可能性。它可能只对它们中的一小部分进行采样是可行的,而且我不知道非抽样的那些是否会以某种方式变成“不关心”......]
我在这里建议的SAT实例肯定会非常大,因为它必须是所有(n选择k)可能允许的位串的析取(OR)。 (我们假设电子邮件地址需要以某种特定的顺序列出,以消除n因子因素。)但它有一个非常规则的结构,可以使其适合分析,可以大大减少解决它所需的时间。为了解决这个问题,我们需要做的就是要求接收器散列原始输入并将此散列值作为输入提供。生成的SAT实例仍然看起来像(n选择k)可能的有效位串(现在表示字符串列表的散列,而不是字符串的原始列表)的析取(OR) - 但是,通过选择足够大的散列大小并将一些logic minimisation应用于生成的实例,我相信可以删除任何剩余的告密模式。 (如果在该地区有更多知识的人可以确认或否认这一点,请编辑或评论。)
这种方法的一个弱点是没有什么能阻止接收器多次“运行”(向SAT实例提供输入)。因此,选择k太低允许接收器通过使用他们自己的地址的不同k组合多次重新运行SAT实例以及剩余输入比特的虚拟值(例如,无效的电子邮件地址)来容易地隔离与发送者共享的电子邮件地址。 。例如。如果k = 2,则接收器可以简单地尝试运行所有n ^ 2对其自己的电子邮件地址和其余的无效电子邮件地址,直到找到一对打开输出位;然后,这些电子邮件地址中的任何一个都可以与所有剩余的电子邮件地址配对,以便在线性时间内检测它们。
答案 1 :(得分:0)
您应该能够使用homomorphic encryption来执行计算。我想在两个站点上创建类似位掩码的东西,执行加密,然后执行结果的异或。我认为this source指出了一些有关您可以执行哪些加密支持XOR的信息。