Тест-векторы для AES, SHA, HMAC

Тест-векторы криптографических алгоритмов в SJCL применяются для проверки корректности реализации базовых примитивов шифрования и хеширования, а также для выявления ошибок в интеграции библиотеки в приложение. В контексте Stanford JavaScript Crypto Library (SJCL) тест-векторы служат опорной точкой для сопоставления результатов работы функций шифрования с эталонными значениями, полученными из стандартов NIST, RFC и других криптографических спецификаций.

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

Тест-вектор представляет собой фиксированный набор данных:

  • входное сообщение
  • ключ (если применимо)
  • дополнительный параметр (IV, salt, nonce)
  • ожидаемый выходной результат

В SJCL такие наборы используются для AES, SHA и HMAC как базовый механизм валидации.

AES: тест-векторы и режимы работы

AES в SJCL реализован с поддержкой нескольких режимов, однако основное внимание в тест-векторах уделяется ECB и CBC как наиболее стандартизированным вариантам.

Типичный тест-вектор AES включает:

  • ключ фиксированной длины (128, 192 или 256 бит)
  • блок открытого текста (16 байт)
  • ожидаемый шифротекст

Пример структуры теста:

var key = sjcl.codec.hex.toBits("000102030405060708090a0b0c0d0e0f");
var plaintext = sjcl.codec.hex.toBits("00112233445566778899aabbccddeeff");
var expected = "69c4e0d86a7b0430d8cdb78070b4c55a";

При шифровании:

var aes = new sjcl.cipher.aes(key);
var encrypted = aes.encrypt(plaintext);

Результат преобразуется в hex и сравнивается с ожидаемым значением.

ECB тест-векторы

Режим ECB используется для проверки корректности одного блока без влияния IV:

  • одинаковые блоки должны шифроваться одинаково
  • любые изменения входного байта полностью меняют результат

Ключевая особенность тестирования ECB — детерминированность результата при фиксированном ключе.

CBC тест-векторы

CBC требует дополнительного параметра IV:

  • первый блок XOR-ится с IV
  • последующие блоки зависят от предыдущего шифротекста

Типичный тест:

var iv = sjcl.codec.hex.toBits("000102030405060708090a0b0c0d0e0f");

Проверяется цепочечная зависимость блоков и соответствие стандартам NIST SP 800-38A.

SHA: тест-векторы хеш-функций

SJCL поддерживает SHA-1, SHA-256 и SHA-512. Тест-векторы для SHA основаны на RFC 6234 и NIST FIPS 180-4.

Характер тестирования:

  • пустая строка
  • короткие строки (“abc”)
  • длинные повторяющиеся последовательности
  • границы блоков (64/128 байт)

Пример SHA-256 теста:

var hash = sjcl.hash.sha256.hash("abc");
var hex = sjcl.codec.hex.fromBits(hash);

Ожидаемый результат:

ba7816bf8f01cfea414140de5dae2223
b00361a396177a9cb410ff61f20015ad

Ключевые свойства SHA тест-векторов

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

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

HMAC: тест-векторы аутентификации сообщений

HMAC в SJCL используется для проверки целостности и подлинности сообщений. Тест-векторы для HMAC основаны на RFC 4231.

Структура теста включает:

  • ключ различной длины (включая превышающие размер блока хеша)
  • сообщение
  • алгоритм хеширования (SHA-1, SHA-256 и т.д.)
  • ожидаемый MAC

Пример:

var key = sjcl.codec.hex.toBits("0b0b0b0b0b0b0b0b0b0b0b");
var msg = "Hi There";

var hmac = new sjcl.misc.hmac(key, sjcl.hash.sha256);
var result = hmac.encrypt(msg);
var hex = sjcl.codec.hex.fromBits(result);

Особенности тестирования HMAC

Основные сценарии тест-векторов:

  • короткий ключ
  • ключ длиннее блока хеша (применение внутреннего хеширования ключа)
  • пустое сообщение
  • длинные сообщения
  • изменение одного символа сообщения

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

Согласование с эталонными стандартами

SJCL не определяет собственные тест-векторы для криптографических примитивов. Вместо этого используются стандартизированные наборы:

  • NIST AES Known Answer Tests (KAT)
  • FIPS 197 (AES)
  • FIPS 180-4 (SHA)
  • RFC 4231 (HMAC-SHA)
  • RFC 3686 (режимы использования HMAC и потоковых конструкций)

Это обеспечивает совместимость результатов SJCL с реализациями OpenSSL, CryptoJS и аппаратными криптомодулями.

Проверка корректности реализации через тест-векторы

Типичный процесс валидации включает последовательные шаги:

  1. фиксация входных данных из тест-вектора
  2. выполнение криптографической операции в SJCL
  3. преобразование результата в каноническую форму (hex или base64)
  4. сравнение с эталонным значением

Несовпадение даже одного символа в выходе указывает на:

  • ошибку в режиме работы алгоритма
  • неправильную обработку битовых массивов SJCL
  • неверное преобразование кодировок
  • проблемы с IV или padding

Влияние представления данных в SJCL

Особенность SJCL заключается в использовании внутреннего формата bitArray. Это приводит к необходимости строгого контроля преобразований:

  • hex → bitArray
  • string → bitArray
  • bitArray → hex/base64

Ошибки в тест-векторах часто связаны не с криптографией, а с некорректной конвертацией данных перед подачей в алгоритм.

Значение тест-векторов для безопасности интеграций

Использование тест-векторов в SJCL позволяет выявлять критические ошибки до выхода системы в эксплуатацию. Особенно это важно в сценариях:

  • хранение паролей
  • подпись запросов API
  • защита сессионных токенов
  • обмен зашифрованными сообщениями

Несоответствие тест-векторам в этих случаях означает потенциальную уязвимость, связанную с неправильной криптографической реализацией.