Угадай строку со временем сравнения. Является ли это возможным? - PullRequest
3 голосов
/ 07 января 2012

Мне было интересно о странной идее: вам дан алгоритм и который берет строку на входе и сравнивает ее со строкой, которую вы не знаете.Алгоритм - это просто тривиальное сравнение, по одному символу за раз.Когда пара, которая не соответствует, найдена, 0 возвращается.В противном случае возвращается 1.

Можете ли вы угадать секретную строку за полиномиальное время, используя предоставленный алгоритм?

Если строка не совпадает, время, используемое для ответа 0, равноменьше, чем время, необходимое для возврата 1, потому что требуется меньше сравнений.Время, затрачиваемое на это, очень мало, и по этой причине вы можете попробовать один раз много раз, чтобы получить более точную оценку.Оценивая время, мы могли бы получить информацию о секретной строке.Если это работает должным образом, мы можем угадать строку по одному символу за полиномиальное время.Так что, если это может произойти, мы можем попробовать какой-нибудь тип атаки с использованием грубой силы за символом.

Имеет ли это смысл?Или я что-то недопонимаю?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 07 января 2012

Вы можете угадать секретную строку, если вы можете ввести свои собственные строки для сравнения, или просто наблюдать, сколько строк (не выбранных вами) сравнивается с секретной строкой, , если сравнение строк было записано втаким образом, что время его выполнения раскрывает информацию о секретной строке .

Это известная уязвимость, которую может иметь криптографическое программное обеспечение, и все серьезные криптографические программы, написанные в настоящее время, избегают этой уязвимости.

Например, чтобы избежать раскрытия информации о своих аргументах, функция, которая проверяет,буферы одинаковы или могут быть записаны по-разному:

int crypto_memcmp(const char *s1, const char *s2, size_t n)
{
  size_t i;
  int answer;
  for (i=0; i<n; i++)
    answer = answer | (s1[i] != s2[i]);
  return answer;
}

Вы можете использовать несколько методов, чтобы проверить, что часть кода не пропускает секреты посредством временных атак.Я написал, как это сделать со статическим анализом здесь , но это основано на предыдущей идее, которая использовала Valgrind (динамический анализ) здесь .

Обратите внимание, что это идет дальшечем это. Эта статья показала, что вам даже не нужно, чтобы путь выполнения зависел от секрета утечки информации.Достаточно было того, что секрет использовался для вычисления некоторых индексов массива, к которым впоследствии был получен доступ.На современных компьютерах это меняет время выполнения, поскольку кэш будет осуществлять два последовательных доступа к аналогичным индексам быстрее, чем два последовательных доступа к индексам, которые находятся далеко друг от друга, раскрывая информацию о секрете.

1 голос
/ 07 января 2012

Вы можете определить строку по битам. для каждого бита используйте двоичный поиск

например:

ты уже знаешь первые биты. скажи это (Sa).

Теперь вы должны определить (+ 1) бит.

есть верхняя граница (Sa)zzzzzzz... и нижняя граница (Sa)azzzzzz....

сначала вы угадываете (a + 1) -й бит (a+z)/2, скажем r, затем строка (Sa)rzzzzzz..., и в результате вы обновляете верхнюю и нижнюю границы.

...