【问题标题】:Guessing a string with time comparison. Is it possible?通过时间比较来猜测字符串。是否可以?
【发布时间】:2012-01-07 08:51:21
【问题描述】:

我想知道一个奇怪的想法:给定你,算法在输入中接受一个字符串并将它与你不知道的字符串进行比较。该算法只是一个简单的比较,一次一个字符。当找到不匹配的一对时,返回 0。否则返回 1。

你能用提供的算法在多项式时间内猜出秘密字符串吗?

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

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

提前致谢。

【问题讨论】:

  • 好的,我只是想知道。最近有很多家庭作业问题。
  • 仅仅尝试猜测 10 个字母的字符串将需要 26^10 次尝试。如果您想使用提供的方法进行猜测,则需要对每个字母进行一百次尝试,这会将所需的尝试次数增加到 (26*100)^10,这是非常不现实的。
  • @Ranty 绝对不是。假设时间准确,猜第一个字母需要 26 次尝试,然后猜第二个字母需要 26 次,……,10 字母串可以在 260 次尝试中猜出。那是如果你最不走运但有完美的测量值。如果你不那么倒霉但测量不完善,你可能需要 10 倍。
  • 这就是重点。这样做,问题就变成了线性的。
  • Vector 如果您对该主题感兴趣,请搜索所谓的“定时侧信道攻击”。其中一些真的很花哨,比如利用缓存效应来获得函数的计时,理论上哪个算法应该执行 O(1)。其他侧通道是 CPU 消耗的功率(现在您可以使用硬件监视器非常准确地测量它)以及加密函数的执行对 other 程序的缓存的影响,即即使加密没有表现出时间效应,系统的其他部分也可能会。这是疯狂的东西。

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


【解决方案1】:

如果您可以输入自己的字符串进行比较,您可以猜测秘密字符串,或者只是观察足够的字符串(不是您选择的)与秘密字符串进行比较,如果字符串比较已经写在一个这样它的执行时间就会显示有关秘密字符串的信息

这是一个已知的密码软件可能存在的弱点,现在编写的所有严肃的密码软件都避免了这个弱点。

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

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 展示了您如何甚至不需要执行路径来依赖秘密来泄露信息。将秘密用于计算随后访问的一些数组索引就足够了。在现代计算机上,这会改变执行时间,因为缓存将使对相似索引的两次连续访问比对彼此相距较远的索引的两次连续访问更快,从而揭示有关秘密的信息。

【讨论】:

  • answer 未初始化,因此不知道answer = answer | ... 的结果可能是什么。它总是可以返回非零。如果不需要正确性,这是迷惑攻击者的好方法。
  • s1[i] != s2[i] 可能会产生一个条件分支。您可以考虑改用s1[i] ^ s2[i]
  • @noloader 够公平的。实际上,我有一篇关于“编译器攻击”的博客文章,其中攻击者向开源编译器提交了一个补丁,该补丁被接受是因为它通常会加快速度,但在编译源代码时也会引入反向通道泄漏试图避开它们。
【解决方案2】:

您可以逐位确定字符串。对于每个位使用 二分查找

例如:

您已经知道第一个位。说出来(萨)。

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

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

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

【讨论】:

  • 字符串比较通常不会逐位进行(它会同时比较整个字节甚至更大的数据块),并且您(作为攻击者)不会变得越来越小-结果,仅“匹配 n 个块”(如果有的话)。所以没你说的那么容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2014-12-20
  • 2016-07-18
相关资源
最近更新 更多