2011-02-10 49 views
1

我正在处理人工编写的文本文档,并且我执行基于字典的字符串匹配以在文档中查找特定的字符串。加密:字符串的散列与字符串的子字符串的散列相关联

出于安全原因,我无法以未加密的文本格式输入文档,而是以强烈的加密格式输入文档。我不能让在本机上工作的开发人员访问未加密的输入字符串,但他们可以访问匹配的字符串。

这样可以很清楚:

Dictionary = {"Apple", "Apple pie", "World War II"} 

Document1 = "apple is my favorite fruit." -> Should match "apple" 

Document2 = "apple pie was invented during world war II" -> Should match "apple pie" and "world war II" 

所以匹配的字符串是不区分大小写的,只有匹配最长的发生(我使用的阿霍Corasick)。

我看到的选项是:

  1. 查找的加密函数F,其中F( “ABCD”)= F( “A”)+ F( “B”)+ F( “C”) + F(“D”)= F(“AB”)+ F(“CD”)。

  2. 将文档按空格分块,散列块和字典,然后查找相似性。 (复杂)

  3. 建立一个独立的单元负责加密和字符串匹配与混淆代码。 (最明显的方式)

由于我不擅长密码学,我可能会错过这里的东西。任何人都可以看到实现这一目标的更好方法?

+0

文件加密时,我有点不清楚。它们在到达您的代码之前是否已加密,或者您是否对它们进行加密?如果他们已经加密,你有钥匙给他们吗? – 2011-02-10 15:41:47

+0

该文件来自客户端,也在我们的控制之下。我们的目标是不让任何未加密的信息离开客户端机器,但在我们的服务器中执行此过程。 – parsa 2011-02-10 16:01:53

回答

2

如果我理解正确,我们的目标是防止对本机有实际访问权限并访问其上运行的进程的人能够确定文档的内容。如果这个“坏人”非常专注,我认为这是不可能的。他将能够从进程空间中提取解密文档所需的关键信息。作为一般规则,如果攻击者具有物理访问权限,那么可以做的事情并不多。

如果程序可以将文档的部分文本与已知文本进行匹配,那么攻击者将能够观察并提取信息。混淆代码可能会让代码变得更加困难,但是如果信息足够有价值,那么攻击者将会更加努力。

看起来,如果服务器可以以安全的方式运行并尽可能限制物理访问,那将会更好。当然,还存在很多问题(例如,由于开发人员显然不被信任,因此需要对代码进行恶意代码审计),但至少可以让您找到有可能被捍卫的职位。

编辑有关您正在尝试执行的加密的一些想法。例如,如果使用CBC(密码块链接)模式下的AES加密,则不可能从文档中解密单个单词(假定文档是作为整体进行加密的)。每个密文块都依赖于前面的块。因此,有必要将整个文档解密到感兴趣的地方。换句话说,你将不得不解密整个文档来搜索它。

另一种加密可能性是在CTR模式下使用AES。 CTR模式会生成密码流(基于密钥和某些初始化向量)以及与纯文本相对的XOR以生成密文。在这种模式下,可以解密文档中间的一部分而不需要解密上一节。但是这有点误导和一些语义学争论。即使您不必解密前面的部分,但仍然有必要为整个文档生成密码流,直至感兴趣的地方。从攻击者的角度来看,这与解密文档相同,因为攻击者可以访问加密文本(大概是在你描述的情况下)和生成的XOR流,这将产生纯文本。

3

首先,满足您的条件任何加密功能:

F("ABCD") = F("A")+F("B")+F("C")+F("D") 

本质上是不强的加密(假设+这里意味着串联)。问题是这个条件意味着F("A")是不变的,这意味着它的加密相当于一个简单的替代密码,易受频率分析影响。

然而,一个更大的问题是,任何解决方案将容易受到字典攻击。如果您可以确定未知文档中的单词是有限字典中的特定单词,那么您还可以在完整的字典中搜索该单词 - 这样,您可以快速发现整个明文。

2

您提出的解决方案#1是一个非常非常困难的问题 - 已知可以解决,但几乎肯定不值得您一边解决。

你想要的技术是Homomorphic Encryption。它在2009年首次由IBM的Craig Gentry演示,可以在不暴露明文的情况下执行任意计算。

对于几乎所有的应用来说,最先进的方法可能效率太低 - 而指数安全性可以通过“多项式”计算获得(这是所有理论家真正关心的),多项式足够大没有价值。这可能会在不久的将来发生变化。

虽这么说,我看不出有任何理由,你为什么不能:

hash each entry in the dictionary 
    (split each entry on whitespace, multiword entries are tuples of hashes) 
split document on whitespace, hash each word 
do the matching with the hashes 

从本质上讲,你匹配的任意项目,不是天生的话。客户可以生成单词项目地图,并将项目传递给服务器。服务器不需要知道任何关于这些项目的信息,只是字典中的一个项目出现在文本中。