似乎密码学中发生了一些有趣的事情:最近出现了第一个 homomorphic encryption 方案(explanation,HT)。粗略地说,这是一种将x
编码为f(x)
的方法,这样即使您不能轻易地知道f(x+y)
和f(x)
,也可以轻松计算f(y)
恢复x
和y
(同样适用于f(x*y)
)。
此类方案的实际应用是什么(一旦确定其安全性)?对我来说,似乎他们可以更容易地编写用于操纵私有数据的算法。
以下是我的想法:
示例:我有银行A,B,C的帐户。实体X想要确认我的总金额超过1000美元;它很乐意接受A,B,C或D银行的声明,但遗憾的是我在任何单一账户中都没有足够的资金。银行A使用我的公钥加密有关我500美元的信息;同样,银行B和C分别加密我有200美元和300美元的信息。他们将这些数据发送给X,他们将这些数据添加到一些数字中,我证明实际上加密了1000美元(通过使用我的公钥加密1000美元并证明结果是相同的)。我已经证明了一些事情而没有透露X
我在每个帐户中有多少钱。
另一个例子:好公民X_1,......,X_n正在合作选择两个候选人中的一个,其中一个是拿铁咖啡,其中一个是拿铁咖啡 A l另一个是 B ible-bearing枪支爱好者(所有名字都是虚构的)。他们认为他们希望投票是私密但快速的。他们以加密的矢量格式(1, vote_A, vote_B, vote_None)
向选举委员会发送他们的选票,选举委员会将其公开添加,并以(count, count_A, count_B, count_None)
的形式获得结果。在核实count = count_A + count_B + count_None
之后,官员宣布了其中一名候选人的胜利,之后由于某些与电子投票无关的理由宣布选举无效,并在未来10年在法庭上进行了争斗,但是,嘿,不管怎样,这不是我的问题。
备注: - 我相信这些特定的例子甚至可以用于RSA,因为它只需要在一次操作中同态。希望我们可以通过更多操作获得更有趣的东西 - 所以,提出示例!
我特别希望看到包含有可能在实践中使用的代码和/或开发框架的答案,原因是SO不是理论计算机科学讨论板。
同形算法,重复下面在评论中所说的内容,允许创建一个程序,在不知道它们的情况下管理数据。不幸的是,程序的类型有些限制:你不能if (x=0) ...
,因为x
是加密的,每一步都很慢(涉及一些格子)。
答案 0 :(得分:10)
这是黑暗中的狂野镜头:
我们正在考虑保护明文免受进行计算的人的影响。但是如果目标是保护明文和算法呢?
以MRI机器为例。 MRI机器中最昂贵的部分是机器分析磁共振数据的算法。因此,它们受到硬件设备的严密保护,这些设备旨在破坏程序,然后允许不受信任的一方(或任何人)对其进行检查。
如果MRI制造商可以集中MRI数据计算,那么丢失算法的风险就会大大降低。但是,法律禁止他们访问私人患者数据。
原来如此!同态加密允许在患者数据和算法都受到保护的情况下发生这种情况。 “完全”同态加密(即在加密数据上引入环同态)允许更高效和更健壮的计算集合来对数据进行操作。
答案 1 :(得分:3)
作为一名PKI极客,如果同态密码函数也是一个非对称密钥系统,那么在签名世界中你就有了一些非常有趣的可能性。签名者可以潜在地签署消息,并且接收者可以将消息的部分和密文的相应部分重新发送给第三方。
在函数表示法中,那将是:
用户签名:
符号(明文,私钥)=密文
并传送:
发送(明文,密文,证书)
应用获取细分:
plaintext = desiredPlaintext + otherPlaintext
并使用以下内容计算相同的密文转换:
如果ciphertext :: plaintext那么?? :: desiredPlaintext
找到所需的密文
应用程序仅将所需内容转发给外部服务:
发送(desiredPlaintext,desiredCiphertext,certificate)
服务可以验证此消息,就像用户直接发送消息一样。
这取决于用于压缩明文的哈希算法也是同态的。如果没有,这不会起作用......或者没有应用散列算法。
如果您希望外部服务执行某些操作以响应已签名的用户请求,但是您不希望公开用户发送到该外部服务的所有内容,这可能非常有用。
一个例子是一个简单的包裹订购系统 - 我向网络应用程序发送购买物品集合的请求。为了超级安全,我签署了一份采购订单,确认我想要(并承诺支付)一些物品,运送到某个特定地点,某个特定日期以及某些特定付款信息。现在..网络应用程序将要发生几件事:
库存或运输没有理由知道我如何支付账单。并且可能没有理由让财务人员知道我的送货地址......在每种情况下,所需的文本和所需的密文都会发生变化,具体取决于接收者是谁。这在Amazon.com使用的书籍系统中更为有效,我从亚马逊购买的实体与提供该项目的实体(旧书销售商)不同。
阅读关于格子密码学的论文,它听起来更像是一个对称的密钥系统......这对于签署消息并不是那么有利。
关于“永不言败”的概念,我并不是说将它用于隐私应用是不合理的。但是你可以找到从密文到明文的多种方式,这显然很麻烦。
答案 2 :(得分:3)
同态加密的最大应用是数据挖掘,恕我直言。这种算法的使用可以同时解决隐私和趋势发现的问题。例如,假设您的公司在某些SAS提供商处托管其销售信息。现在,该提供商可以为您提供复杂的数据挖掘服务,而无需您实际显示您的真实信息。 基本上,您可以将数据发送给计算提供商,让他利用他的CPU周期代表您进行计算,然后将加密数据发回给您。对于那些希望迁移到基于云的系统的公司来说,这真的太棒了,但是隐私/ IP问题阻碍了他们这样做。
另一个潜在的应用程序,在更低和更个人的层面上,将处理各种财务数据。 ilya的示例扩展可以适用于您的会计师提交纳税申报表,而无需实际查看您的财务信息,信用卡处理等。
然而,我一直很兴奋,直到该计划经过严格测试并被认为是安全的。加密algos有一个臭名昭着的习惯,即他们的第一次测试失败,进行修订并重复循环,直到他们被某些政府机构“认证”。
答案 3 :(得分:3)
您可能有兴趣观看Bruce Schneier对同态加密的相当负面看法:
http://www.schneier.com/blog/archives/2009/07/homomorphic_enc.html?nc=11
答案 4 :(得分:2)
我不知道f(x) + f(x)
计算的成本有多高,但也许它可以用作实现加密数据库的方式。
您可以存储100万行加密为f(x_1)
,f(x_2)
,... f(x_n)
的部分数据。你可以做到
SELECT SUM(x)
FROM Foo
WHERE y = 'some value'
可以先计算SUM(f(x))
然后将其解密为SUM(x)
来计算。
答案 5 :(得分:2)
这样你可以执行一个有限深度的任意非递归电路,所以给定一个对数密钥长度你可以执行一个NC1算法(基本上是一个前馈布尔电路)。
那么,你怎么用呢?
让我们看看Map /减少一组输入的电路和减少方案。
首先是数据:
我们可能不希望客户端必须加密我们要搜索的所有数据,因此您可以向服务器提供加密的1和加密的0,并让它使用环结构来构建我们的任意加密整数,或者我们可以直接使用它们作为位。这样,服务器可以提供我们正在搜索的部分或全部数据。对于整数,它可以通过农民算术(双或双,每个位加1)来构造它们,对于位,它只提供适当的加密位。
我们可以在我们的设计中混合和匹配布尔值和整数值,通过评估cond *然后+(1 - cond)* else使用1作为true来获得if / then / else(需要评估两个分支SIMD样式)在cond中0为false,因此您可以使用环的内置算法来使您的电路更浅。
另一方面,我们也可能预先加密了一些数据,但由于您必须继续使用相同的密钥集来使用它,因此要做到这一点变得非常棘手。
所以,现在我们有服务器提供的数据。现在,加密您不希望服务器知道的内容,例如您正在搜索的内容,并让它们在正确的位置将其馈送到电路中,比如作为地图功能的额外输入。 / p>
我们应该能够在每个输入上映射任意类似NC1的电路以提取字段,将某些值相乘,并且通常将其映射为可以便宜地降低的形式。
然后使用更小的电路来减少这些碎片,例如对于具有良好尺寸限制结果的简单幺半群。 (即你映射以获得一个指示你是否找到匹配的位,然后通过用小加法器电路计数这些位来减少)
由于你只需要逻辑构造电路并模拟它在同态环中的这些加密位上的执行,你可以使用一个小的DSL相对快速地实现它,就像Haskell中的Lava一样,假设你得到了同态加密件直。
另外,请记住,每个门的执行都非常严重
。总而言之,
答案 6 :(得分:1)
现有同态加密算法的问题在于,您只能用它执行多对数(NC1)电路,它几乎可以排除任何有趣的算法。
另外,编码的复杂程度似乎并不比自己执行多对数电路的复杂程度低,所以你没有乍一看没有任何免费工作,除非你做一些特别棘手的事情。它
答案 7 :(得分:1)
像SETI @ Home,蛋白质折叠项目等分布式计算相当受欢迎,因为它们利用来自数千名用户的CPU时间和电力的捐赠。更有趣的是人们可以获得报酬以为商业项目提供这些资源的模型。但是,没有负责任的公司希望将其数据发送到数千台匿名计算机进行处理。如果您可以有效地将算法应用于加密数据,则可以将处理委派给没有信任关系的任何人。
答案 8 :(得分:1)
电子投票确实是同态加密的实际应用,即http://heliosvoting.org/
答案 9 :(得分:-1)
在Homomorphic Encryption的帮助下,某些银行应用程序可能会变得更快。
他们可以使用云上的加密数据执行操作,而不是将其从云端带到本地并再次置于云端。也不需要加密 - 解密 - 执行操作 - 加密管道,加密 - 执行操作就可以了。