1

我这里有一个函数可以使程序计数、等待等最少计数为 1 毫秒。但我想知道我是否可以这样做会降低精度。我已经阅读了其他答案,但它们主要是关于更改为 linuxsleep 是猜测的,更重要的是这些答案已经有十年左右的历史了,所以也许可能会有新的功能来做到这一点。

这是功能-

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;
}
4

1 回答 1

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;

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

编辑:纳入路人的评论:

如果我们想减少大小泄漏,我们可以尝试向上舍入大小并限制索引值。

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;

可能存在一个很小的缓存定时侧通道(因为如果 ,我们不会再有缓存未命中i > clamped_i),但是因为a并且b无论如何都应该在缓存层次结构中,我怀疑这种差异是否可以以任何方式使用。

于 2017-07-10T10:15:07.757 回答