我在这里有一个函数可以使程序计数,等待等,最小计数为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;
}
答案 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
时再次出现缓存未命中),但由于a
和b
应该在无论如何,缓存层次结构,我怀疑差异是否可用。