Рейтинг:1

Достаточно ли для проверки закодированного алгоритма использования только одного или двух тестовых векторов для ChaCha20?

флаг it

Для проверки алгоритма шифрования/дешифрования ChaCha20, написанного на VB.NET, я ищу дополнительные тестовые векторы ChaCha20, основанные на окончательной спецификации для ChaCha20, которую можно найти. здесь. См. тестовый вектор в подразделе 2.3.2. Этот тестовый вектор проверяет мой код, который дает точный результат, указанный в тестовом векторе. (позже в документе есть почти идентичный вектор, два блока с разными счетчиками, что также отлично подтверждает это).

Тестовые векторы, которые я нашел в черновых спецификациях ChaCha20, не дают точно такой же результат, как указано в этих черновых тестовых векторах спецификаций. Они используют одноразовый номер другого размера по сравнению с окончательной спецификацией (черновик 64 бита, окончательный 96 бит), а состояние счетчика не указано (я предполагаю, что оно равно 0).

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

Было бы здорово иметь больше тестовых векторов, основанных на окончательной спецификации ChaCha20, чтобы убедиться, что код обеспечивает точные необходимые результаты. Спасибо!

    2.3.2. Тестовый вектор для функции блока ChaCha20

   Для тестового вектора мы будем использовать следующие входные данные для ChaCha20.
   функция блокировки:

   o Ключ = 00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:
      14:15:16:17:18:19:1а:1б:1в:1г:1д:1е. Ключ представляет собой последовательность
      октеты без определенной структуры, прежде чем мы скопируем их в
      Состояние Ча-Ча.

   o Nonce = (00:00:00:09:00:00:00:4a:00:00:00:00)

   o Количество блоков = 1.

   После настройки состояния ChaCha это выглядит так:

   Состояние ChaCha с настройкой ключа.

       61707865 3320646e 79622d32 6b206574
       03020100 07060504 0b0a0908 0f0e0d0c
       13121110 17161514 1b1a1918 1f1e1d1c
       00000001 09000000 4a000000 00000000

   После выполнения 20 раундов (10 раундов столбца, чередующихся с 10
   "диагональные раунды"), состояние Ча-Ча выглядит так:

   Состояние Ча-Ча после 20 раундов

       837778ab e238d763 a67ae21e 5950bb2f
       c4f2d0c7 fc62bb2f 8fa018fc 3f5ec7b7
       335271c2 f29489f3 eabda8fc 82e46ebd
       d19c12b4 b04e16de 9e83d0cb 4e3c50a2

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

   Состояние ChaCha в конце операции ChaCha20

       e4e7f110 15593bd1 1fdd0f50 c47120a3
       c7f4d1c7 0368c033 9aaa2204 4e6cd4c3
       466482d2 09aa9f07 05d7c214 a2028bd9
       d19c12b5 b94e16de e883d0cb 4e3c50a2
Рейтинг:1
флаг in

Я бы сказал, что это отчасти так. Из-за раундов даже операция с одним блоком будет выполняться несколько раз. Блок также не принимает каких-либо специальных входных данных: у вас есть один блок, который отображается на один выходной блок.

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

Что еще более важно: в то время как приведенный выше тест проверяет блочную операцию, он не проверяет потоковую операцию. Это с большей вероятностью вызовет проблемы. Проблема в том, что кодирование/декодирование (например, преобразование байтов в слова) и буферизация менее тривиальны, чем многие думают. Так что имеет смысл, например, протестировать все виды размеров открытого текста и убедиться, что Обновить функции работают корректно. Это не так уж отличается от тестирования некриптографических функций; вы ожидаете, например, те же проблемы с операциями кодирования/декодирования и ввода-вывода.

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

Наконец, поскольку это криптографический сайт: если вы делаете какие-либо заявления о защите от атак по сторонним каналам, вам, вероятно, следует протестировать и их. Конечно, здесь вам несколько повезло, так как Бернштейн обычно предполагает такие атаки при разработке шифра, но, тем не менее, реализации могут быть уязвимы.


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

DotNET Afficionado avatar
флаг it
Спасибо, Маартен (я хотел проголосовать за ваш ответ, но новому участнику здесь, на https://crypto.stackexchange.com/, нужно 15 баллов, после чего он может проголосовать), это полезно знать. Я уже тестирую потоки байтов, которые я шифрую и расшифровываю, а затем проверяю, идентичны ли они исходному «открытому тексту», но да, мне нужно автоматизировать это, чтобы протестировать множество потоков байтов и посмотреть, не столкнусь ли я с некоторыми странными пограничными случаями. То, что некоторые тестовые векторы из черновых спецификаций не дают такого же результата, меня несколько беспокоит.
DotNET Afficionado avatar
флаг it
Также беспокоит то, что некоторая документация VB.NET кажется неверной в отношении чередования битов, здесь говорится, что даже для целых чисел без знака 32-й бит будет замаскирован так, чтобы всегда быть 0, что на самом деле не так (не имеет смысла для целых чисел без знака). ). Обеспокоенный тем, что что-то странное или плохо документированное в VB.NET создает пограничный случай, о котором я не знаю, пока это не создаст реальную проблему. См.: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/left-shift-operator.
DotNET Afficionado avatar
флаг it
В этом посте также указывается проблема тестовых векторов из черновиков, которые не (всегда) работают, хотя окончательные векторы спецификации идеальны, здесь он указывает на проблему со счетчиком, но это не то, что я нахожу. Только тестовый вектор со всеми нулями (ключ, одноразовый номер и счетчик, установленный на все нули) дает правильный результат, если я использую пример, где ключ = 1 (что означает последнее 32-битное слово в ключе, позиция 11 в ChaCha матрица установлена ​​на 1), я получаю другой конечный результат. См. https://crypto.stackexchange.com/questions/81337/chacha-matrix-tests-for-original-implementation-not-passing-due-to-bad-counter.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.