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

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

Другие вопросы по тегам