Как протестировать методы криптографии

Высокое разрешение, Низко Служебная Синхронизация для Intel Processors

, Если Вы находитесь на аппаратных средствах Intel, вот то, как считать ЦП счетчик команд в реальном времени. Это скажет Вам количество циклов ЦП, выполняемых, так как процессор был загружен. Это - вероятно, счетчик с самыми прекрасными зернами, который можно получить для измерения производительности.

Примечание, что это - количество циклов ЦП. На Linux можно получить скорость ЦП от/proc/cpuinfo и разделиться для получения числа секунд. Преобразование этого к двойному довольно удобно.

, Когда я выполняю это на своем поле, я добираюсь

11867927879484732
11867927879692217
it took this long to call printf: 207485

, Вот Руководство разработчика Intel, которое дает тонны детали.

#include 
#include 

inline uint64_t rdtsc() {
    uint32_t lo, hi;
    __asm__ __volatile__ (
      "xorl %%eax, %%eax\n"
      "cpuid\n"
      "rdtsc\n"
      : "=a" (lo), "=d" (hi)
      :
      : "%ebx", "%ecx");
    return (uint64_t)hi << 32 | lo;
}

main()
{
    unsigned long long x;
    unsigned long long y;
    x = rdtsc();
    printf("%lld\n",x);
    y = rdtsc();
    printf("%lld\n",y);
    printf("it took this long to call printf: %lld\n",y-x);
}

5
задан MaLKaV_eS 28 October 2009 в 10:21
поделиться

4 ответа

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

Самым авторитетным ресурсом для тестовых векторов, конечно же, является документ, определяющий алгоритм. Большинство стандартных документов будет включать набор тестовых векторов. Например, RFC 1321 содержит следующий набор тестовых данных:

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
  = d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") 
  = 57edf4a22be3c955ac49da2e2107b67a
22
ответ дан 18 December 2019 в 06:03
поделиться

Закодированный MD5 всегда будет иметь одно и то же значение. Таким образом, вы можете сделать утверждение с кодировкой строки, и значение, которое вы знаете, подходит.

assert_equals encode("str"), "341be97d9aff90c9978347f66f945b77"

Закодированное значение «str» всегда должно быть «341be97d9aff90c9978347f66f945b77».
Если ваша кодировка возвращает это значение, она работает хорошо. В противном случае возникнет проблема.

4
ответ дан 18 December 2019 в 06:03
поделиться

Основная предпосылка модульного тестирования - запустить метод с некоторыми данными, в которых вы заранее знаете, что будет на выходе. be.

Итак, чтобы протестировать метод шифрования, вам необходимо сгенерировать несколько совпадающих пар входных и выходных данных. Возьмите строку данных, скажем: «Это тестовые данные». Зашифруйте его с помощью стороннего инструмента шифрования или библиотеки, чтобы получить «Guvf vf fbzr grfg qngn».

Теперь у вас есть пара входных данных с ожидаемым выходом.

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

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

Очевидно, что теория такая же для метода MD5, просто возьмите некоторые образцы данных, запустите их через сторонний MD5 инструмент хеширования, а затем используйте пары входных / выходных данных, чтобы убедиться, что ваш метод дает правильный результат.

1
ответ дан 18 December 2019 в 06:03
поделиться

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

Я хотел бы добавить еще одну вещь: по возможности , пожалуйста, не используйте MD5. У него уже так много известных проблем безопасности, что поддержание совместимости с какой-то старой системой - единственная причина, по которой кто-то хотел бы использовать его в новом коде.

Если можете, используйте SHA-256 (определенный в FIPS-180-2 , включая набор тестовых векторов). Если вам не нужно 256 бит хэша, обрежьте его до 128,

0
ответ дан 18 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: