用时间比较猜一个字符串。可能吗?

时间:2012-01-07 08:51:21

标签: c++ c time cryptography brute-force

我想知道一个奇怪的想法:你被给予并且算法在输入中取一个字符串并将它与你不知道的字符串进行比较。算法只是一个微不足道的比较,一次只有一个字符。当找到不匹配的一对时,返回0。否则返回1.

您能否使用提供的算法猜测多项式时间内的秘密字符串?

当字符串不匹配时,用于给出答案0的时间小于返回1所用的时间,因为需要较少的比较。涉及的时间非常短,因此您可以多次尝试单个实例以获得更准确的估算。估计我们可能有关于秘密字符串的信息所花费的时间。如果这种方法正常,我们可以在多项式时间内一次猜出一个字符串。因此,如果发生这种情况,我们可以通过char尝试某种强力攻击char。

这有意义吗?还是有什么我误解的?

提前致谢。

2 个答案:

答案 0 :(得分:4)

你可以猜测秘密字符串,如果你可以输入自己的字符串进行比较,或者只是观察足够的字符串(不是你选择的)与秘密字符串进行比较,如果字符串比较是用方式,使其执行时间显示有关秘密字符串的信息

这是加密软件可以拥有的一个已知的弱点,现在所有写的严肃的加密软件都避免了这个弱点。

例如,为避免泄露有关其参数的信息,可以编写一个测试两个缓冲区是相同还是不同的函数:

int crypto_memcmp(const char *s1, const char *s2, size_t n)
{
  size_t i;
  int answer;
  for (i=0; i<n; i++)
    answer = answer | (s1[i] != s2[i]);
  return answer;
}

您可以使用多种技术来检查一段代码是否不会通过计时攻击泄露秘密。我写了如何使用静态分析here来做这件事,但这是基于之前使用Valgrind(动态分析)here的想法。

请注意,它远不止于此。 This article显示了你甚至不需要执行路径来依赖泄漏信息的秘密。这个秘密用于计算随后访问的一些数组索引就足够了。在现代计算机上,这会改变执行时间,因为缓存将对两个连续访问类似索引的速度比对彼此远离的索引的两次连续访问更快,从而显示有关秘密的信息。

答案 1 :(得分:1)

您可以逐位确定字符串。对于每个位使用二进制搜索

例如:

你已经知道了第一位。说出来(Sa)。

现在你必须确定第(a + 1)位。

有上限(Sa)zzzzzzz...和下限(Sa)azzzzzz...

首先你猜第(a + 1)位是(a+z)/2,比如r,然后字符串是(Sa)rzzzzzz...,结果,你更新上限和下限界。