Какие тесты вы бы написали, чтобы проверить правильность реализации MD5?

#testing #md5

#тестирование #md5

Вопрос:

Предположим, у вас есть доступ к реализации «oracle», вывод которой, как вы полагаете, является правильным.

Наиболее очевидный способ сделать это, по-видимому, состоит в том, чтобы запустить набор известных комбинаций открытого текста / хэша через реализацию и посмотреть, получаются ли они так, как ожидалось. Произвольное количество этих примеров может быть создано путем генерации случайных открытых текстов (используя статическое начальное значение, чтобы сохранить его детерминированным) и используя oracle для нахождения их хэшей.

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

Существует также побочная проблема указания длин этих случайных открытых текстов, поскольку MD5 принимает строку произвольной длины в качестве входных данных. Для моих целей меня не волнуют длинные входные данные (скажем, что-либо длиннее 16 байт), поэтому вы можете использовать тот факт, что это реализация MD5 «специального назначения» в вашем ответе, если это упрощает ситуацию, или вы можете просто ответить для общего случая, если это все равно.

Ответ №1:

Если у вас алгоритмическая ошибка, весьма вероятно, что каждый хэш будет неправильным. Хэши по своей природе неумолимы.

Поскольку большинство возможных ошибок будут выявлены быстро, вам действительно не понадобится так много тестов. Главное, что нужно рассмотреть, — это крайние случаи:

  • Длина = 0 (входные данные пусты)
  • Длина = 1
  • Длина = 16
  • Входные данные содержат по крайней мере один байт со значением 0
  • Повторяющиеся шаблоны байтов во входных данных (будет ли это значимым граничным случаем для MD5?)

Если все они пройдут, возможно, вместе с тестами для одного или двух более репрезентативных входных данных, вы могли бы быть довольно уверены в своем алгоритме. Существует не так уж много крайних случаев (если только кто-то, более знакомый с деталями алгоритма, не сможет придумать еще несколько).