ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем ОСНОВЫ ПРОГРАММИРОВАНИЯ Тестирование генераторов псевдослучайных чисел Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» Библиотка GNU C Library Glibc является библиотекой языка Си, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д. Библиотека C используется для всех динамически скомпонованых программ. Она написана Free Software Foundation для GNU операционных систем. Glibc выпущена под лицензией GNU LGPL. Помимо других возможностей, библиотека Glibc имеет средства генерации случайных чисел. Реализованы три стандарта: • ISO Random: PRNG, предусмотренный в С11 • BSD Random: функции, заимствованные из BSD (Berkley Software Distribution). В настоящее время BSD называют семейство Unix-подобных операционных систем. • SVID Random: функции, стандартизированные в системах SVID (System V Interface Definition) компании AT&T. Функции стандарта ISO и BSD используют одну кодовую базу, которая реализует 5 режимов генерации случайных чисел, выбор между которыми осуществляется через функцию initstate. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 2 Режимы работы PRNG (GNU C Library) По умолчанию glibc-2.18/stdlib/random_r.c /* Linear congruential. #define>TYPE_0 #define>BREAK_0 #define>DEG_0 #define>SEP_0 0 8 0 0 /* x[7] + x[3] + 1. #define>TYPE_1 #define>BREAK_1 #define>DEG_1 #define>SEP_1 /* x[15] + x + 1. #define>TYPE_2 #define>BREAK_2 #define>DEG_2 #define>SEP_2 */ /* x[31] + x[3] + 1. #define>TYPE_3 #define>BREAK_3 #define>DEG_3 #define>SEP_3 */ 1 32 7 3 /* x[63] + x + 1. #define>TYPE_4 #define>BREAK_4 #define>DEG_4 #define>SEP_4 */ 3 128 31 3 */ 4 256 63 1 */ 2 64 15 1 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 3 Алгоритм выбора PRNG в Glibc glibc-2.18/stdlib/random_r.c int __initstate_r (unsigned int seed, char *arg_state, size_t n, struct random_data *buf) { /* Linear congruential. */ if (buf == NULL) #define>TYPE_0 0 goto fail; #define>BREAK_0 8 … int type; if (n >= BREAK_3) type = n < BREAK_4 ? TYPE_3 : TYPE_4; else if (n < BREAK_1) { if (n < BREAK_0) goto fail; type = TYPE_0; } else type = n < BREAK_2 ? TYPE_1 : TYPE_2; #define>DEG_0 #define>SEP_0 0 0 /* x7 + x3 + 1. */ #define>TYPE_1 #define>BREAK_1 #define>DEG_1 #define>SEP_1 1 32 7 3 /* x15 + x + 1. */ #define>TYPE_2 #define>BREAK_2 #define>DEG_2 #define>SEP_2 2 64 15 1 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 4 Особенности реализации 1. Тесты NIST предназначены для работы с потоком битов, однако большинство ГПСЧ генерирует многобитовые числа. В частности, функция rand() возвращает целые числа типа int, разрядность которых составляет 31 бит. Для проведения тестов требуется функция доступа к заданному разряду числа. Для решения данной задачи необходимо использовать поразрядные операции. Алгоритм получения i-го разряда числа в переменной v выглядит следующим образом: 1. Скопировать значение v во временную переменную t (t = v). 2. Выполнить поразрядный сдвиг t на i разрядов вправо (t = t >> i). 3. Отбросить все разряды t, расположенные левее при помощи маски 0x1 (t = t & 0x1). Например: v = 01101110, необходимо получить разряды № 3 и 4: t = 01101110, i = 3 t = 01101110 >> 3 = 00001101 t = 00001101 & 00000001 = 00000001 3-й бит = 1 t = 01101110, i = 4 t = 01101110 >> 4 = 00000110 t = 00000110 & 00000001 = 00000000 4-й бит = 0 Реализовать алгоритм в виде функции int getbit(unsigned int v, int i). © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 5 Особенности реализации (2) 2. Для вычисления значения критериев требуется реализация функций erfc(x) и igamc(x, y). • Реализация erfc(x) есть в библиотеке математических функций Glibc. Для того, чтобы ею воспользоваться необходимо подключить заголовочный файл math.h: #include <math.h> кроме этого при компиляции программы необходимо указать флаг "-lm", который явным образом осуществит подключение библиотеки libm (сокращение от libmath): gcc –Wall –o prog prog.c -lm • Функция igamc отсутствует в Glibc. Поэтому ее реализация выложена на сайте в виде дополнительных материалов. Функция находится в модуле cehpes, который состоит из двух файлов cephes.c и cephes.h. Для использования функции igamc необхдимо подключить заголовочный файл в одинарных кавычках: #include "cephes.h" а также при компиляции указать файл cephes.c в командной строке: gcc –Wall –o prog prog.c cephes.c -lm Для демонстрации использования модуля в дополнительных материалах есть файл test.c. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 6 NIST. Частотный побитовый тест Суть теста заключается в проверке того, что в битовом потоке с равномерным распределением количество единичных битов совпадает с количеством нулевых. Если случайные числа распределены по равномерному закону, то каждый бит потока является независимой случайной величиной, распределенной по закону Бернулли, который описывает подбрасывание монеты. Вероятность возникновения 0 и 1 (орел и решка) – 0,5. Пусть дан битовый поток ε = ε1, ε2, ε3, …, εn-1, εn, где εi – i-й бит потока. При проведении теста вычисляется сумма n Sn X i , i 1 X i 2 i 1. Если εi = 0, то Xi = -1, а если εi = 1, то Xi = 1. Таким образом при полном совпадении количества нулей и единиц S = 0. Далее вычисляется значение функции: man efrc Sn 2 u 2 , efrc( z ) P _ value efrc e du z 2n Если P_value > α, то тест успешно пройден. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» функция в glibc 7 NIST. Частотный побитовый тест n Sn X i , i 1 Sn 2 u 2 , efrc( z ) e du. X i 2 i 1. P _ value efrc z 2n Например: ε = 1011010101, n=10. Тогда Sn = 1 + (-1) + 1 + 1 + (-1) + 1 + (-1) + 1 + (-1) + 1 = 2. Sn 2n 2 0,447213595 20 P _ value erfc0,44721359 0,527089 0.001 На основании полученного P-value последовательность является случайной. можно © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» заключить, что 8 Задание №1. Провести частотное побитовое тестирование ГПСЧ Провести частотный анализ следующих ГПСЧ, выполнить тесты для n = 103, 104, 105, 106, 108 бит. 1. Линейный конгруэнтный xn = 10000*xn-1. генератор, описываемый формулой: 2. Линейный конгруэнтный xn = 10000*xn-1 +12345. генератор, описываемый формулой: 3. Линейный конгруэнтный генератор, описываемый xn = 1103515245*xn-1 +12345 (аналогично glibc). формулой: 4. Аддитивный генератор Glibc (TYPE1). 5. Аддитивный генератор Glibc (TYPE3). © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 9 NIST. Частотный блочный тест Суть теста заключается в определении доли 1-ц в блоке, состоящем из M бит и сравнении его с ожидаемым значением M/2. При M = 1 этот тест аналогичен предыдущему частотному. Далее приведен алгоритм теста. 1. Битовый поток разбивается на N блоков по M бит каждый, остаток отбрасывается. Например, при M = 6: 101101011101100101101011011011011110101010111101011 2. Далее для каждого блока j = 1, 2, …, N вычисляется доля πj 1-ц в нем: 1 j M M i 1 ( j 1) M i . 3. Вычисляется статистика χ2 по формуле: 2 1 2(obs) 4M i . 2 i 1 N © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 10 NIST. Частотный блочный тест (2) 2. Далее для каждого блока j = 1, 2, …, N вычисляется доля πj 1-ц в нем: 1 j M M i 1 ( j 1) M i . 3. Вычисляется статистика χ2 по формуле: 2 1 (obs ) 4M i . 2 i 1 N 2 4. После этого вычисляется P_value по формуле: u / 2 N / 2 1 e u du ( obs) 2 ( N / 2) 2 N / 2 N 2 (obs) igamc , 2 2 Программный модуль cephes.c, содержащий реализацию функции igamc и пример его использования размещены на сайте 5. Если значение P_value > α, то числа не случайные. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 11 NIST. Частотный блочный тест (3) 1 j M 2 1 ( j 1) M i . (obs ) 4M i . 2 i 1 i 1 N 2 (obs) P _ value igamc , 2 2 M N 2 Например: n = 10, M = 3, ε = 0110011010, N = 3. Тогда будет создано три блока: 011, 001 and 101, при этом последний разряд ε будет отброшен. π1 = 2/3, π2 = 1/3, π3 = 2/3. χ2(obs) = 4∙3∙( (2/3 – 1/2)2 + (1/3 – 1/2)2 + (2/3 – 1/2)2) = 1. P-value = igamc(N/2, χ2(obs)/2) = igamc(3/2, 1/2) = 0,801252 > 0.001. На основании полученного P-value можно заключить, что последовательность является случайной. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 12 Задание №2. Провести частотное блочное тестирование ГПСЧ (размер блока – 128 бит) Провести частотный анализ следующих ГПСЧ, выполнить тесты для n = 103, 104, 105, 106, 108 бит. 1. Линейный конгруэнтный xn = 10000*xn-1. генератор, описываемый формулой: 2. Линейный конгруэнтный xn = 10000*xn-1 +12345. генератор, описываемый формулой: 3. Линейный конгруэнтный генератор, описываемый xn = 1103515245*xn-1 +12345 (аналогично glibc). формулой: 4. Аддитивный генератор Glibc (TYPE1). 5. Аддитивный генератор Glibc (TYPE3). © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 13 NIST. Тест на последовательность одинаковых битов Суть теста заключается в анализе количества серий бит, состоящих из одинаковых значений (например, единиц). Например в битовом потоке: 101101011101100101101011011011011110101010111101011 Количество серий из 1-ц составляет 18. Целью теста является сопоставить фактически наблюдаемое количество серий с теоретической оценкой. Он показывает является ли колебание между разными значениями бит слишком быстрым или слишком медленным. 1. Перед проведением теста необходимо определить долю 1-ц в битовом потоке. Это достигается путем вычисления суммы бит и проверки соотношения: 1 n 1 2 n, n i 1 2 n Если соотношение не выполняется, проводить тест не имеет смысла и уже на данном этапе можно констатировать его провал. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 14 NIST. Тест на последовательность одинаковых битов (2) 2. Вычисляется количество серий, состоящих из одинаковых значений бит: 0, k k 1 Vn r (k ) 1, r (k ) k 1 1, k k 1 n 1 3. Вычислить P-value: Vn 2 n (1 ) P value erfc 2 2n (1 ) 4. Если значение P_value > α, то числа не случайные. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 15 NIST. Тест на последовательность одинаковых битов (3) 1 n 1 2 n, n i 1 2 n 0, k k 1 Vn r (k ) 1, r (k ) k 1 1, k k 1 n 1 Vn 2 n (1 ) P value erfc 2 2n (1 ) Например: n = 10, ε = 1001101011, then n=10 and π = 6/10 = 3/5. |π - 1/2| = | 3/5 – 1/2 | = 0.1 < τ = 0,63246 ε = 1 00 11 0 1 0 11 => V10 = (1+0+1+0+1+1+1+1+0)+1=7. 7 2(3 / 5) 10 (1 (3 / 5)) P value erfc 2 20 (3 / 5) (1 (3 / 5)) На основании полученного P-value последовательность является случайной. 0,147232 0.001 можно © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» заключить, что 16 Задание №3. Провести тестирование ГПСЧ на последовательность одинаковых битов. Провести частотный анализ следующих ГПСЧ, выполнить тесты для n = 103, 104, 105, 106, 108 бит. 1. Линейный конгруэнтный xn = 10000*xn-1. генератор, описываемый формулой: 2. Линейный конгруэнтный xn = 10000*xn-1 +12345. генератор, описываемый формулой: 3. Линейный конгруэнтный генератор, описываемый xn = 1103515245*xn-1 +12345 (аналогично glibc). формулой: 4. Аддитивный генератор Glibc (TYPE1). 5. Аддитивный генератор Glibc (TYPE3). © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 17