Случайные числа ОСНОВЫ ПРОГРАММИРОВАНИЯ Преподаватель: Доцент Кафедры ВС, к.т.н.

advertisement
ФГОБУ ВПО "СибГУТИ"
Кафедра вычислительных систем
ОСНОВЫ ПРОГРАММИРОВАНИЯ
Случайные числа
Преподаватель:
Доцент Кафедры ВС, к.т.н.
Поляков Артем Юрьевич
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
План лекции
• Случайные числа и их применение в вычислительной технике.
• Подходы к генерации случайных чисел.
• Псевдослучайные числа и алгоритмы их формирования.
• Статистическая проверка случайной природы чисел.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
2
Применение случайных чисел
Азартные игры и лотереи.
Компьютерное моделирование
Криптография
Компьютерные игры
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
3
Генерация случайных чисел
1. Ранние способы генерации случайных чисел. Их большим недостатком
является крайне низкая скорость генерации.
2. Более эффективными являются физические генераторы случайных чисел,
которые используют природные шумы.
HotBits
Random.org
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
4
Генерация случайных чисел (2)
3. Генерация псевдослучайных чисел (ГПCЧ).
Генератор псевдослучайных чисел, англ. Pseudo-random number generator
(PRNG), это алгоритм, позволяющий генерировать длинные последовательности
чисел, свойства которых близки к свойствам случайных чисел. Однако такие
последовательности имеют период (повторяются с каким-то расстоянием).
Middle-square
method
seed ← значение
for i ← 0 to n do
rnd[i] = (seed / 1000) % 1000000;
seed = rnd[i]2;
4. Генерация согласно заданному распределению вероятностей.
Такие методы в основном используют числа с равномерным распределением и
известную функцию плотности некоторого распределения (например
нормального).
В зависимости от источника равномерного распределения результат будет либо
псевдослучайным либо случайным.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
5
Линейный конгруэнтный генератор
Генератор псевдослучайных чисел, англ. Pseudo-random number generator
(PRNG), это алгоритм, позволяющий генерировать длинные последовательности
чисел, свойства которых близки к свойствам случайных чисел. Однако такие
последовательности имеют период (повторяются с каким-то расстоянием).
Конкретная последовательность чисел обычно определяется "зерном" из
которого "прорастает" вся остальная последовательность. Алгоритм PRNG для
одинакового
значения
зерна
будет
всегда
порождать
одинаковую
последовательность.
Наиболее простым вариантом PRNG является линейный конгруэнтный
генератор (Linear Congruential Generator – LCG), который описывается следующим
рекуррентным соотношением:
x0 = seed
xn+1 = (a∙xn + b) mod m
Период такого генератора (длина неповторяющейся последовательности) не
превышает m.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
6
Линейный конгруэнтный генератор (2)
Наиболее простым вариантом PRNG является линейный конгруэнтный
генератор (linear congruential generator – LCG), который описывается следующим
рекуррентным соотношением:
x0 = seed
xn+1 = (a∙xn + b) mod m
Source
m
m, m > 0 – модуль (modulus);
a, m > a > 0 – мультипликатор (multiplier);
c, m > c ≥ 0 – инкремент (increment)
x0 – случайное зерно.
a
c
Borland C/C++
232
glibc (GCC)
Borland Delphi,
Virtual Pascal
231
1103515245 12345
232
134775813
22695477
1
Биты xn, формирующие
случайноге число
rand(): 30..16
lrand(): 30..0
30..0 m = 2147413647
1
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
63..32
7
Период ГПCЧ (PRNG)
http://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел
Никакой детерминированный алгоритм не может генерировать
полностью случайные числа, он может только аппроксимировать
некоторые их свойства.
Джон фон Нейман: « … всякий, кто питает слабость к
арифметическим методам получения случайных чисел, грешен вне
всяких сомнений … ».
Любой ГПСЧ с ограниченными ресурсами рано или поздно
зацикливается — начинает повторять одну и ту же
последовательность чисел. Длина циклов ГПСЧ зависит от самого
генератора и часто составляет около 2n / 2, где n — размер
внутреннего состояния в битах. Линейные конгруэнтные и LFSRгенераторы (Регистр сдвига с линейной обратной связью (РСЛОС,
англ. Linear feedback shift register) обладают максимальными
циклами порядка 2n.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
8
Период ГПCЧ (PRNG) (2)
http://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел
Большинство простых арифметических генераторов хотя и
обладают большой скоростью, но страдают от многих серьёзных
недостатков:
• Слишком короткий период/периоды.
• Последовательные значения не являются независимыми.
• Некоторые биты «менее случайны», чем другие.
• Неравномерное одномерное распределение.
• Обратимость.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
9
С11. Pseudo-random sequence generation functions
В стандарте языка Си (ISO/IEC 9899:2011, сокр. С11) предусмотрены
следующие функций генерации псевдослучайных чисел:
#include <stdlib.h>
int rand(void);
void srand(unsigned int seed);
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C11
…The rand function computes a sequence of pseudo-random integers
in the range 0 to RAND_MAX … The value of the RAND_MAX
macro shall be at least 32767…
GLibC: RAND_MAX = 2147483647
… The srand function uses the argument as a seed for a new sequence
of pseudo-random numbers to be returned by subsequent calls to rand.
If srand is then called with the same seed value, the sequence of
pseudo-random numbers shall be repeated. If rand is called before any
calls to srand have been made, the same sequence shall be generated as
when srand is first called with a seed value of 1.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
10
С11. Pseudo-random sequence
generation functions (2)
В стандарте также приведен пример линейного конгруэнтного
генератора, который может быть использован для генерации случайных
чисел.
C11
…
EXAMPLE The following functions define a portable implementation of rand and
srand.
static unsigned long int next = 1;
int rand(void) // RAND_MAX assumed to be 32767
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}
void srand(unsigned int seed)
{
next = seed;
}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
11
GNU LibC
http://www.gnu.org/software/libc/manual/html_node/Pseudo_002dRandom-Numbers.html#Pseudo_002dRandom-Numbers
В реализации GNU LibC (GLibC) стандарта Си предлагается более
широкий выбор функций генерации случайных чисел:
• ISO Random: PRNG, предусмотренный в С11
• BSD Random: функции, заимствованные из BSD (Berkley Software
Distribution). В настоящее время BSD называют семейство Unixподобных операционных систем.
• SVID Random: функции, стандартизированные в системах SVID
(System V Interface Definition) компании AT&T.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
12
BSD random
В BSD системах предусмотрен более сложный и гибкий генератор
случайных чисел, который можно настраивать. Помимо линейного
конгруэнтного генератора, аналогичного предложенному в стандарте
языка СИ доступно еще 4 алгоритма генерации псевдослучайных чисел.
Кроме стандартных функций, аналогичных функциям стандарта:
BSD функция
Аналог С11
long int random(void);
int rand(void);
void srandom(unsigned int seed);
void srand(unsigned int seed);
Доступны две дополнительные
выбирать тип используемого PRNG:
функции,
которые
позволяют
// Выбор и инициализация начального состояния генератора
char *initstate(unsigned int seed, char *state, size_t n);
// Установка начального состояния генератора
char *setstate(char *state);
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
13
GNU C Library (2)
По умолчанию
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
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
14
Выбор ГПCЧ(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
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
15
GNU C Library (glibc)
glibc-2.18/stdlib/random_r.c
int
__random_r (struct random_data *buf,
{
...
int32_t *result)
if (buf->rand_type == TYPE_0)
{
int32_t val = state[0];
val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
state[0] = val;
*result = val;
}
...
Source
m
glibc (GCC)
231
a
c
1103515245 12345
Биты xn, формирующие
случайноге число
30..0 (m = 0x7FFFFFFF)
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
16
Алгоритм GLibC PRNG, TYPE0
#include <stdio.h>
#include <stdlib.h>
Вывод программы:
1103527590, next = 377401575
377401575, next = 662824084
int main()
662824084, next = 1147902781
{
1147902781, next = 2035015474
int rval, i;
2035015474, next = 368800899
int tmp[8];
368800899, next = 1508029952
// BREAK0 = 8 ≤ 8 < BREAK1 = 32
1508029952, next = 486256185
initstate(1,(char*)tmp, 8);
486256185, next = 1062517886
1062517886, next = 267834847
for(i=0;i<10;i++){
267834847, next = 180171308
rval = random();
int next = (((unsigned int)rval * 1103515245) + 12345) & 0x7fffffff;
printf("%d, next = %d\n", rval, next);
}
return 0;
}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
17
Алгоритм вычисления периода PRNG
input n
for i ← 1 to n do
rnd[i] = rand() // запомнить первые n псевдослучайных чисел
found ← false // Флаг – признак обнаружения rnd
i←1
// Проверяемый элемент rnd
count ← n
// Количество сгенерированных чисел
while ( не found ) do
if rnd[i] = rand() then // rnd[i] совпал, далее проверяем rnd[i+1]
i←i+1
if i = n then // если совпали все n элементов - выход
found ← true;
else // если очередной элемент не совпал – проверяем сначала
i ← 1;
count ← count + 1
output count
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
18
Период GLibC ГПCЧ(PRNG), TYPE0
Source
m
glibc (GCC)
231
a
c
1103515245 12345
Биты xn, формирующие
случайноге число
30..0
Экспериментально полученное значение периода линейного
конгруэнтного ГПCЧ, вычисленное согласно приведенному алгоритму,
составляет 2147483774.
Это означает, что последовательности чисел с номерами
1 – 2147483774, 2147483775 – 4294967550, 4294967551 – 6442451325
будут совпадать.
Период такого генератора составляет примерно 231. Такой период
слишком мал, поэтому применение ГПCЧ типа 0 на практике не
желательно.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
19
Алгоритм GLibC PRNG, TYPE1
http://www.mathstat.dal.ca/~selinger/random/
#include <stdio.h>
#define MAX 1000
#define seed 1
main() {
int r[MAX], i, start = 0, tmp[32];
initstate(1,(char*)tmp,32);
r[0] = seed;
for (i=1; i<DEG; i++) {
r[i] = (16807LL * r[i-1]) % 2147483647;
if (r[i] < 0) {
r[i] += 2147483647;
}
}
start = i;
for (i=start; i < start + SEP; i++) {
r[i] = r[i-DEG];
}
start = i;
for (i=start; i < start + DEG*10; i++) {
r[i] = r[i-DEG] + r[i-SEP];
}
start = i;
for (i=start; i<MAX; i++) {
r[i] = r[i-DEG] + r[i-SEP];
int r1 = rand();
printf("%d <-> %d\n",
((unsigned int)r[i]) >> 1, r1);
}
}
#define
#define
#define
#define
TYPE
BREAK
DEG
SEP
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
1
32
7
3
20
Период GLibC ГПCЧ(PRNG), TYPE1
Количество совпавших
элементов
Расстояние между
совпадениями
1
3∙107 – 9∙109
2
16∙109
3
69∙109
4
138∙109
n = 128
272∙109
Таким образом, период ГПCЧ типа 1 в
(272∙109 / 2147483774) = 126 раз
превышает период ГПCЧ типа 0.
ГПCЧ типа 1 – 4 относятся к Аддитивным ГПCЧ и
характеризуются существенно большим периодом по сравнению с
линейным.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
21
Принцип работы аддитивного ГПCЧ
#define
#define
#define
#define
TYPE
BREAK
DEG
SEP
1
32
7
3
+
+
1
2
3
4
DEG
5
6
7
1
2
3
SEP
1. Начальное заполнение массива
производится при помощи линейного
конгруэнтного генератора
2
4
6
6
9
12
13
10
14
19
r[0] = seed;
for (i=1; i<DEG; i++) {
r[i] = (16807LL * r[i-1]) % 2147483647;
if (r[i] < 0) {
r[i] += 2147483647;
}
}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
22
Принцип работы аддитивного ГПCЧ
#define
#define
#define
#define
TYPE
BREAK
DEG
SEP
1
32
7
3
+
+
1
2
3
4
5
6
7
DEG
2. Часть (SEP) элементов
дублируется
1
2
3
2
4
6
6
9
12
13
10
14
19
SEP
start = i;
for (i=start; i < start + SEP; i++) {
r[i] = r[i-DEG];
}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
23
Принцип работы аддитивного ГПCЧ (2)
#define
#define
#define
#define
TYPE
BREAK
DEG
SEP
1
32
7
3
+
+
1
2
3
4
5
6
7
1
DEG
3. Первые k чисел обычно
отбрасываются. В GLibC
отбрасываются 10*DEG чисел.
2
3
2
4
6
6
9
12
13
10
14
19
SEP
start = i;
for (i=start; i < start + DEG*10; i++) {
r[i] = r[i-DEG] + r[i-SEP];
}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
24
Тестирование ГПСЧ
Случайность – это вероятностная характеристика, поэтому свойства
случайной последовательности могут быть описаны с применением
вероятностей.
Существует два подхода к тестированию ГПСЧ:
1. Статистический тест основывается на том, что вероятностные
характеристики идеального генератора случайных чисел известны
априори. Поэтому имея набор последовательней псевдослучайных
случайных чисел, сгенерированных тестируемым ГПСЧ, можно
вычислить их вероятностные характеристики и сравнить с идеальными.
2. Физический тест предполагает применение исследуемого генератора
в реальных программах. Например, моделирование методом Монте-Карло
физических явлений, результат которого заранее известен.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
25
Статистические тесты
Статистический тест предполагает наличие известного признака,
которое отличает случайные числа от остальных. Примером такого
предположения может быть "В случайном битовом потоке количество
нулей совпадает с количеством единиц".
Математически такой признак оформляется в виде статистики –
функции f (x) от последовательности x, которая проверяется на
случайность. Например:
n
f ( x)   (2 xi  1), x  {0, 1}
i 1
Исходя из предположения, что x – случайное число, распределенное по
равномерному закону, делается заключение о том, каким должно быть
распределение f (x) и выбирается критическое значение t.
В рассматриваемом примере величина f (x)/n должна иметь
нормальное распределение. Это известный научный факт, который был
доказан и, следовательно, может использоваться для проверки.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
26
Статистические тесты (2)
Тест заключается в проверке гипотезы H0 – последовательность
случайна. Обратная гипотеза Ha заключается в том, что
последовательность не случайна. Результаты работы теста могут быть
разделены на 4 класса:
Заключение теста
Истинное заключение
Принять H0
Принять Ha
(отклонить H0)
Последовательность случайна
(H0 истинна)
Нет ошибки
Ошибка первого рода
Последовательность не
случайна (Ha истинна)
Ошибка второго рода
Нет ошибки
Вероятность α ошибки первого рода (уровень значимости теста)
задается перед проведением тестирования. В тестах NIST α = 0.01.
Вероятность β ошибки второго рода зависит от многих факторов, при
этом количество n бит в потоке и вероятности α и β связаны. Если
известно две из трех величин, третья может быть найдена.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
27
Статистические тесты (3)
Каждый тест предполагает вычисление статистики f (ε) для некоторой
проверяемой последовательности ε. и сравнивается с критической
величиной t.
Вероятность ошибки первого рода: P{ f (ε) > t | H0 – ложь }.
Вероятность ошибки второго рода: P{ f (ε) ≤ t | H0 – истина}.
Статистика
f (ε) используется для вычисления P-value, которое
определяет силу доказательств гипотезы H0.
P-value = 1 означает, что последовательность совпадает с идеальной
случайной последовательностью.
P-value = 0 означает, что последовательность абсолютно неслучайна.
В остальных случаях, для того, чтобы решить, является
последовательность случайной или нет, используется уровень α
значимости. Если P-value ≥ α, то гипотеза H0 принимается, иначе –
отклоняется.
Обычно α выбирается в диапазоне [0.001, 0.01].
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
28
Тесты NIST
NIST – National Institute of Standards and Technology – Национальный
институт стандартов и технологий разработал набор инструментов для
тестирования ГПСЧ для криптографических программ, состоящий из 15
тестов.
Набор тестов включает:
1. Частотный побитовый тест
2. Частотный блочный тест
3. Тест на последовательность одинаковых битов
4. Тест на самую длинную последовательность единиц в блоке
5. Тест рангов бинарных матриц (линейная независимость)
6. Спектральный тест
7. Тест на совпадение неперекрывающихся шаблонов
8. Тест на совпадение перекрывающихся шаблонов
9. Универсальный статистический тест Маурера
10. Тест на линейную сложность
11. Тест на периодичность
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
29
Тесты NIST (2)
NIST – National Institute of Standards and Technology – Национальный
институт стандартов и технологий разработал набор инструментов для
тестирования ГПСЧ для криптографических программ, состоящий из 15
тестов.
Набор тестов включает:
12. Тест приблизительной энтропии
13. Тест кумулятивных сумм
14. Тест на произвольные отклонения
15. Другой тест на произвольные отклонения
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
30
Тесты NIST (3)
NIST – National Institute of Standards and Technology – Национальный
институт стандартов и технологий разработал набор инструментов для
тестирования ГПСЧ для криптографических программ, состоящий из 15
тестов.
Все тесты анализируют битовый поток:
101101011101100101101011011011011110101010111101011
Случайные числа формируются из такого потока путем разбиения его
на блоки по m бит. Например, при m = 6 получается следующий набор
случайных чисел:
101101011101100101101011011011010010101010111101011
45
29
37
43
27
18
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
42
61
31
NIST. Частотный побитовый тест
Суть теста заключается в проверке того, что в битовом потоке с
равномерным распределением количество 1-ц совпадает с количеством 0-й.
Если случайные числа распределены по равномерному закону, то каждый
бит потока является независимой случайной величиной, распределенной
по закону Бернулли, который описывает подбрасывание монеты.
Вероятность возникновения 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. Далее вычисляется значение
функции:

 Sn 
2
u 2
man efrc
, efrc( z ) 
P _ value  efrc
e
du


 z
функция в glibc
 2n 
Если P_value > α, то тест успешно пройден.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
32
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  erfc0,44721359  0,527089  0.001
На основании полученного P-value
последовательность является случайной.
можно
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
заключить,
что
33
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
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
34
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 > α, то числа не случайные.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
35
NIST. Частотный блочный тест (2)
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 можно заключить, что
последовательность является случайной.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
36
NIST. Тест на последовательность
одинаковых битов
Суть теста заключается в анализе количества серий бит, состоящих из
одинаковых значений (например, единиц). Например в битовом потоке:
101101011101100101101011011011011110101010111101011
Количество серий из 1-ц составляет 18. Целью теста является
сопоставить фактически наблюдаемое количество серий с теоретической
оценкой. Он показывает является ли колебание между разными значениями
бит слишком быстрым или слишком медленным.
1. Перед проведением теста необходимо определить долю 1-ц в битовом
потоке. Это достигается путем вычисления суммы бит и проверки
соотношения:
1 n
1
2
  n,   
n i 1
2
n
Если соотношение не выполняется, проводить тест не имеет смысла и
уже на данном этапе можно констатировать его провал.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
37
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 > α, то числа не случайные.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
38
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


можно
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
заключить,
что
39
Литература
1. Макконнелл, Дж. Основы современных алгоритмов (Analysis of Algorithms: An
Active Learning Approach) – М.: Техносфера, 2006. – 368с. – ISBN 5-94836-005-9,
0-7637-1634-0
2. NIST cryptographic toolkit
http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html
3. SPRNG Links http://www.sprng.org/links.html
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
40
Download