Функция для отсчета времени с точностью до миллисекунды

У меня есть функция, которая может подсчитывать, ждать и т. Д. С наименьшим счетом в 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;
}

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 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 в любом случае должен быть в иерархии кеша, я сомневаюсь, что разница может быть использована любым способом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]