Encryption 密码学:字符串的散列与字符串的子字符串的散列相关

Encryption 密码学:字符串的散列与字符串的子字符串的散列相关,encryption,cryptography,Encryption,Cryptography,我正在处理人工编写的文本文档,并进行基于词典的字符串匹配,以查找文档中的特定字符串 出于安全原因,我不能以未加密的文本格式输入文档,而是以强加密格式输入。我不能允许在单元上工作的开发人员访问未加密的输入字符串,但他们可以访问匹配的字符串 更清楚地说: Dictionary = {"Apple", "Apple pie", "World War II"} Document1 = "apple is my favorite fruit." -> Should match "apple"

我正在处理人工编写的文本文档,并进行基于词典的字符串匹配,以查找文档中的特定字符串

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

更清楚地说:

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"
所以字符串匹配不区分大小写,只匹配我使用的最长匹配

我看到的选择是:

查找加密函数F,其中FABCD=FA+FB+FC+FD=FAB+FCD

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

让一个单独的单元负责加密和与模糊代码的字符串匹配。最明显的方式


由于我不擅长加密,我可能会遗漏一些东西。有人能找到更好的方法来实现这一点吗?

如果我理解正确,目标是防止对机器具有物理访问权限以及对机器上运行的进程具有访问权限的人能够确定文档的内容。我认为如果这个坏人非常专注的话,这是不可能的。他将能够从进程空间中提取解密文档所需的密钥信息。一般来说,如果攻击者具有物理访问权限,那么就没有什么可以做的了

如果程序能够将文档的部分文本与已知文本相匹配,那么攻击者将能够观察到并提取信息。对代码进行模糊处理可能会使其更加困难,但如果信息足够有价值,那么攻击者只会更加努力

如果服务器能够以安全的方式运行,并尽可能限制物理访问,似乎会更好。当然,仍然有很多问题需要对代码进行恶意代码审计,例如,因为开发人员显然不受信任,但这至少让您有机会得到辩护

根据您正在尝试做的事情,编辑一些关于加密的想法。例如,如果在CBC密码块链接模式下使用AES加密,则假设文档作为一个整体进行加密,则不可能从文档中解密单个单词。每个密文块取决于前一个块。因此,有必要将整个文档解密到感兴趣的位置。换句话说,您必须解密整个文档才能进行搜索。


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

如果我理解正确,其目标是防止对计算机具有物理访问权限以及对其上运行的进程具有访问权限的人能够确定文档的内容。我认为如果这个坏人非常专注的话,这是不可能的。他将能够从进程空间中提取解密文档所需的密钥信息。一般来说,如果攻击者具有物理访问权限,那么就没有什么可以做的了

如果程序能够将文档的部分文本与已知文本相匹配,那么攻击者将能够观察到并提取信息。对代码进行模糊处理可能会使其更加困难,但如果信息足够有价值,那么攻击者只会更加努力

如果服务器能够以安全的方式运行,并尽可能限制物理访问,似乎会更好。当然,仍然有很多问题需要对代码进行恶意代码审计,例如,因为开发人员显然不受信任,但这至少让您有机会得到辩护

根据您正在尝试做的事情,编辑一些关于加密的想法。例如,如果在CBC密码块链接模式下使用AES加密,则假设文档作为一个整体进行加密,则不可能从文档中解密单个单词。每个密文块取决于prec 一个街区。因此,有必要将整个文档解密到感兴趣的位置。换句话说,您必须解密整个文档才能进行搜索。


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

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

F("ABCD") = F("A")+F("B")+F("C")+F("D")
本质上不是强加密,这里假设+表示串联。问题是,这个条件意味着FA是不变的,这意味着它的加密等价于一个简单的替换密码,容易受到频率分析的影响


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

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

F("ABCD") = F("A")+F("B")+F("C")+F("D")
本质上不是强加密,这里假设+表示串联。问题是,这个条件意味着FA是不变的,这意味着它的加密等价于一个简单的替换密码,容易受到频率分析的影响


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

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

你想要的技术是。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

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

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

你想要的技术是。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

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

文档加密时,我有点不清楚。它们是在到达您的代码之前加密的还是您加密的?如果它们已经加密,你有密钥吗?文档来自客户端,也在我们的控制之下。我们的目标是不让任何未加密的信息离开客户机,而是在我们的服务器上进行处理?如果是这样,是否无法在客户端对文档进行加密并将其传输到服务器,然后对其进行解密并对未加密的文档执行处理?是字符串匹配在服务器端完成。这是可能的,但是在服务器端工作的每个开发人员都可以访问文档,除非我们
分离/混淆这部分代码。文件加密时我有点不清楚。它们是在到达您的代码之前加密的还是您加密的?如果它们已经加密,你有密钥吗?文档来自客户端,也在我们的控制之下。我们的目标是不让任何未加密的信息离开客户机,而是在我们的服务器上进行处理?如果是这样,是否无法在客户端对文档进行加密并将其传输到服务器,然后对其进行解密并对未加密的文档执行处理?是字符串匹配在服务器端完成。这是可能的,但是在服务器端工作的每个开发人员都可以访问该文档,这是不可取的,除非我们分离/混淆该部分代码,计算结果仅对加密输入的提交者可用-OP似乎希望计算结果对服务器本身可用。这不是同一件事,它必然揭示关于明文的信息。您的哈希方法失败,因为恶意服务器可以将客户端提供的哈希与较大的字典进行比较,从而显示整个明文。您为什么说OP希望服务器上有可用的计算结果?关于散列:没有使用散列的具体原因;词典可以是{'1','2','3','4',…},文档可以是{'1','27','64',…}。客户端维护映射{'1':'cat','2':'in','3':'The','4':'hat'…},并且从不与服务器共享此映射。当然,这也取决于服务器不需要知道计算的结果。这就是问题的答案——也可以认为它完全是客户端做的。同态加密,计算结果仅对加密输入的提交者可用-OP似乎希望计算结果对服务器本身可用。这不是同一件事,它必然揭示关于明文的信息。您的哈希方法失败,因为恶意服务器可以将客户端提供的哈希与较大的字典进行比较,从而显示整个明文。您为什么说OP希望服务器上有可用的计算结果?关于散列:没有使用散列的具体原因;词典可以是{'1','2','3','4',…},文档可以是{'1','27','64',…}。客户端维护映射{'1':'cat','2':'in','3':'The','4':'hat'…},并且从不与服务器共享此映射。当然,这也取决于服务器不需要知道计算结果,这就是问题的答案——也可以认为它完全是客户端的。