用于计算时间的功能,精度小于一毫秒

时间:2017-07-10 09:57:16

标签: c++ timing-attack

我在这里有一个函数可以使程序计数,等待等,最小计数为1毫秒。但我想知道我是否可以做同样会降低精度。我已经阅读了其他答案,但它们主要是关于changing to linux or sleep is guesstimate,而更多的是这些答案大约有十年之久,所以也许可能有新的功能来实现它。

这是功能 -

void sleep(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}

实际上,我试图创建一个类似于secure_compare的函数,但我不认为在比较两个字符串时浪费1毫秒(当前最小计数)是明智的想法。

这是我为此做的功能 -

bool secure_compare(string a,string b){
    clock_t limit=wait + clock();  //limit of time program can take to compare
    bool x = (a==b);

    if(clock()>limit){             //if time taken to compare is more increase wait so it takes this new max time for other comparisons too 
        wait = clock()-limit;
        cout<<"Error";
        secure_compare(a,b);
    }

    while(clock()<limit);         //finishing time left to make it constant time function
        return x;
}

1 个答案:

答案 0 :(得分:1)

您正在尝试使比较功能与时间无关。基本上有两种方法可以做到这一点:

  • 测量通话所需的时间并睡眠适当的数量
    这可能只会将一侧通道(时序)换成另一侧(功耗,因为睡眠和计算可能具有不同的功率使用特性)。
  • 使控制流程更加依赖数据:

您可以实现自己的比较,而不是使用正常的字符串比较,比较所有字符,而不仅仅是第一次不匹配,比如:

bool match = true;
size_t min_length = min(a.size(), b.size());
for (size_t i = 0; i < min_length; ++i) {
    match &= (a[i] == b[i]);
}
return match;

这里,没有发生分支(条件操作),因此每次调用此方法时,使用相同长度的字符串应该花费大致相同的时间。因此,您泄漏的唯一旁道信息是您比较的字符串的长度,但如果它们具有任意长度,则很难隐藏。

编辑:纳入Passer的评论:

如果我们想减小尺寸泄漏,我们可以尝试将尺寸向上调整并锁定指数值。

bool match = true;
size_t min_length = min(a.size(), b.size());
size_t rounded_length = (min_length + 1023) / 1024 * 1024;
for (size_t i = 0; i < rounded_length; ++i) {
    size_t clamped_i = min(i, min_length - 1);
    match &= (a[clamped_i] == b[clamped_i]);
}
return match;

可能存在一个微小的缓存时序sidechannel(因为我们不会在i > clamped_i时再次出现缓存未命中),但由于ab应该在无论如何,缓存层次结构,我怀疑差异是否可用。