在流中查找子字符串而不在纯文本中存储子字符串

时间:2015-06-24 22:02:48

标签: string algorithm

假设我有大量数据流(例如来自网络的数据包),我想确定这些数据是否包含某个子字符串。有多个string searching algorithms,但它们要求算法知道他们正在搜索的纯文本字符串。

可以说,正在搜索的字符串是一个密码,您不希望在此搜索应用程序中以纯文本格式存储它。然而,它将在流中显示为纯文本。例如,您可以存储密码的哈希值和长度。然后,对于流中的每个字节,检查从流哈希到密码哈希的下一个长度字节数据是否有可能匹配。

这样,您可以在不知道密码的情况下确定密码是否在流中。但是,对于每个字节进行一次散列不是快速/高效的。

是否有一个聪明的算法可以在流中找到明文密码,而不直接知道明文密码(而是一些不可逆的等价物)。或者可以使用低质量版本的密码,并存在误报的风险?例如,如果搜索应用程序只知道密码的一半(以纯文本格式),则可能会在某些错误的情况下检测到完整密码而不知道密码。

感谢

P.S这个问题来自我与一些朋友的一个假想的讨论,关于如果你的密码是在网络上以纯文本形式发现的提醒你。

2 个答案:

答案 0 :(得分:3)

您可以使用低熵rolling hash预先筛选每个字节,这样,对于lg k比特的熵,您可以将加密哈希的调用次数减少k倍。

答案 1 :(得分:0)

SAT是NP难问题。假设您的密码长度为n个字符。如果你能找到一种方法来制作足够大的SAT实例

  • 使用来自数据流的m> = n个字节的连续序列作为其8m输入位,并且
  • 产生输出1,当且仅当输入中的位包含从8位的倍数偏移开始的密码

然后通过“操作”这个SAT实例作为电路,你会有一个密码检测器(至少可能)很难“反转”。

在某些方面,你想要的是Boolean logic minimisation的反面。你想要最大,最毛茸茸的电路(理想情况下,对于一些理论上合理的大小和毛羽概念:))计算真值表。很容易想出保存真值表的方法来发展原始的CNF命题逻辑公式 - 例如,如果你有两个子句A和B,那么你总是可以安全地添加一个由所有文字组成的新子句。 A或B - 但是可能更难以想出以一种会混淆现代SAT求解器的方式来增加公式,因为大量的研究已经使这些程序变得超级高效在检测和利用问题中的各种结构时。

注入“并发症”的一种可能途径是使电路计算电路难以计算的功能,如分区或平方根,然后测试这些功能的结果,除了原始输入之外。例如,不是让电路仅测试X[1 .. 8n] = YOUR_PASSWORD,而是让它测试X[1 .. 8n] = YOUR_PASSWORD AND sqrt(X[1 .. 8n]) = sqrt(YOUR_PASSWORD)。如果一个SAT求解器足够聪明,可以“看到”第一个测试意味着第二个测试,那么它可以立即免除与第二个测试相对应的所有子句 - 但由于所有内容都以非常低的级别用命题条款表示,这种关系是(我希望;正如我所说,现代SAT求解器非常惊人)很好地模糊了。我的猜测是,选择像sqrt()这样的整数不是one-to-one的函数是更好:这可能会导致SAT求解器浪费时间去探索看似有希望(但最终不正确)的解决方案