加密:字符串的哈希与字符串的子串的哈希相关联

时间:2011-02-10 15:33:14

标签: encryption cryptography

我正在处理人工编写的文本文档,并且我使用基于字典的字符串匹配来查找文档中的特定字符串。

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

更清楚:

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"

所以字符串匹配不区分大小写,只匹配最长的匹配(我正在使用Aho-Corasick)。

我看到的选项是:

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

  2. 按空格对文档进行分块,散列块和字典,然后查找相似之处。 (复杂)

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

  4. 由于我不擅长密码学,我可能会在这里遗漏一些东西。任何人都可以看到更好的方法来实现这一目标吗?

3 个答案:

答案 0 :(得分:3)

首先,任何满足您条件的加密函数:

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

本质上不是强加密(假设此处+表示连接)。问题是这种情况意味着F("A")是不变的,这意味着加密等同于简单的替换密码,易受频率分析的影响。

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

答案 1 :(得分:2)

如果我理解正确,目标是阻止对机器具有物理访问权限并且对其上运行的进程的访问权限能够确定文档内容的人员。如果“坏人”非常敬业,我认为这是不可能的。他将能够从进程空间中提取解密文档所需的关键信息。作为一般规则,如果攻击者具有物理访问权限,那么就没有太多可以完成的操作。

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

如果服务器可以以安全的方式运行并尽可能地限制物理访问,那似乎会更好。当然,仍然存在很多问题(例如,代码需要针对恶意代码进行审计,因为开发人员显然不受信任),但这至少会使您进入有可能被保护的位置。 / p>

编辑在您尝试执行的操作的上下文中,有关加密的几点想法。例如,如果您在CBC(密码块链接)模式下使用AES加密,则无法从文档中解密单个字(假设文档是整体加密的)。每个密文块都取决于前面的块。因此,有必要将整个文档解密到感兴趣的点。换句话说,您必须解密整个文档才能进行搜索。

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

答案 2 :(得分: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

基本上,你是匹配任意项目,而不是固有的单词。客户端可以生成单词项目映射,并将项目传递给服务器。服务器不需要知道任何有关项目的信息,只需要在文本中出现字典中的项目。