У меня есть функция, которая может подсчитывать, ждать и т. Д. С наименьшим счетом в 1 миллисекунду. Но мне было интересно, если я могу сделать то же самое, снизит точность. Я читал другие ответы, но они в основном о переход на Linux или же сон догадается и что еще, тем ответам было около десяти лет, так что, возможно, могла бы появиться новая функция, чтобы сделать это.
Вот функция-
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;
}
Вы пытаетесь сделать функцию сравнения независимой от времени. Есть два основных способа сделать это:
Вместо использования обычного сравнения строк, вы можете реализовать собственное сравнение, которое сравнивает все символы, а не только до первого несоответствия, как это:
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 By комментарий:
Если мы хотим уменьшить утечку размера, мы могли бы попытаться округлить размер вверх и зафиксировать значения индекса.
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
в любом случае должен быть в иерархии кеша, я сомневаюсь, что разница может быть использована любым способом.
Других решений пока нет …