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