Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №9

.pdf
Скачиваний:
2
Добавлен:
10.08.2024
Размер:
436.55 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Факультет Инфокоммуникационных сетей и систем

Кафедра Защищенных систем связи

Дисциплина Математические основы защиты информации

ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №9

Тест Рабина – Миллера

(тема отчета)

Информационная безопасность (10.03.01)

(код и наименование направления/специальности)

Студент:

 

 

 

Ерохин А.Г.

ИКБ-03

(Ф.И.О.)

 

 

(подпись)

Студент:

 

 

 

Чистяков А.С.

ИКБ-03

(Ф.И.О.)

 

 

(подпись)

Студент:

Пантюхин М.А. ИКБ-03

(Ф.И.О.) (подпись)

К.тех.н, доцент кафедры ЗСС: Кушнир Д.В.

(Ф.И.О.) (подпись)

Санкт-Петербург

2022

Часть 1. Тест Рабина – Миллера

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

Алгоритм был разработан Гари Миллером в 1976 году и модифицирован Майклом Рабином в 1980 году.

Как и для теста Ферма, все числа m>1, которые не проходят этот тест – составные, а числа, которые проходят, могут быть простыми. Для этого теста нет аналогов чисел Кармайкла. В 1980 году было доказано, что вероятность ошибки теста Рабина-Миллера не превышает 1/4. Таким образом, применяя тест Рабина-Миллера r раз для разных оснований, мы получаем вероятность ошибки 2−2r.

Число m - 1 однозначно представляется в виде m - 1=2s∙t, где t нечётно. Целое число a, 1< a < m, называется свидетелем простоты числа m, если выполняются два условия:

m не делится на a;

at ≡ 1 mod m или существует целое k, 0≤ k < s, такое, что:

Теорема Рабина утверждает, что составное нечётное число m имеет не более φ(m)/4 различных свидетелей простоты, где φ(m) – функция Эйлера.

Алгоритм теста Рабина-Миллера

Алгоритм параметризуется количеством раундов r. Рекомендуется брать r порядка величины log2(m), где m — проверяемое число. Для данного m находят такое целое число s и целое нечётное число t, что m − 1 = 2s∙t. Выбирается случайное число a,1 < a < m. Если a не является свидетелем простоты числа m, то выдается ответ «m - составное», и алгоритм завершается. Иначе, выбирается новое случайное число a и процедура проверки повторяется. После нахождения r свидетелей простоты, выдается ответ «m, вероятно, простое», и алгоритм завершается.

2

Алгоритм может быть записан на псевдокоде следующим образом:

Ввод:

число проверяемое на простоту: m > 2 (нечётное натуральное); параметр, определяющий вероятность ошибки теста r.

Вывод:

составное, означает, что m точно составное;

или вероятно простое, т.е. m с высокой вероятностью является простым.

Представить m − 1 в виде 2s·t, где t нечётно, можно сделать последовательным делением m - 1 на 2.

цикл А: повторить r раз:

Выбрать случайное a в диапазоне [2, m − 2] x at mod m

если x = 1 или x = m − 1 то перейти на следующую итерацию цикла А для r = 1 .. s − 1

x x2 mod m

если x = 1 то вернуть составное

если x = m − 1 то перейти на следующую итерацию цикла А вернуть составное

вернуть вероятно простое

Из теоремы Рабина следует, что если r случайно выбранных чисел оказались свидетелями простоты числа m, то вероятность того, что m составное, не превосходит 4 - r.

Задание

1.Выбрать два простых и два составных нечетных числа (не кратных 3, 5 и 7) и еще одно составное число Кармайкла. Выбирать числа для выполнения задания по следующей формуле:

Вычисляем: X = ((студента в группе)+110)*23. Далее произвольно в диапазоне X±20 выбрать нужные числа (если в бригаде один студент, то проверяем 4-ые числа, если два, то 8, если три то 12). Число Кармайкла выбирать по следующему алгоритму:

студент в группе с номером 1. Берёт число 1105 студент в группе с номером 2. Берёт число 1729 студент в группе с номером 3. Берёт число 2465 студент в группе с номером 4. Берёт число 2821

3

студент в группе с номером 5. Берёт число 6601 студент в группе с номером 6. Берёт число 8911

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

2.Проверить каждое из чисел тестом Рабина-Миллера. При выполнении задания в EXCEL выбирать k таком образом, чтоб вероятность принять составное за простое была не более 0,0625. При программировании алгоритма выбирать k таком образом, чтоб вероятность принять составное за простое была не более 10-3.

Вариант 7.

По формуле составим числа для проверки: X = (7+110) * 23 = 2691 Простые числа: 2707 и 2689 Составные числа: 2701 и 2717 Число Кармайкла: 1105

Для числа 2707:

Для числа 2689:

Для числа 2701:

Для числа 2717:

Для числа Кармайкла 1105:

4

Вариант 17.

По формуле составим числа для проверки: X = (17+110) * 23 = 2921 Простые числа: 2939 и 2917 Составные числа: 2921 и 2911 Число Кармайкла: 6601

Для числа 2939:

Для числа 2917:

Для числа 2921:

Для числа 2911:

Для числа Кармайкла 6601:

5

Вариант 24.

По формуле составим числа для проверки: X = (24+110) * 23 = 3082 Простые числа: 3083 и 3067 Составные числа: 3091 и 3077 Число Кармайкла: 8911

Для числа 3083:

Для числа 3067:

Для числа 3091:

Для числа 3077:

Для числа Кармайкла 6601:

Для выполнения задания была написана программа на языке программирования С++.

6

Листинг:

#include <iostream>

using namespace std;

int main(){

setlocale(LC_ALL, "Rus"); srand(time(NULL));

int r, m, a, s = 0, t, x = 1; cout << "Введите число: "; cin >> m;

r = log2(m); t = m - 1;

while (t % 2 == 0) { t /= 2;

s += 1;

}

for (int i = 0; i < r; i++) {

a = rand() % (m-2) + 2;

for (int j = 0; j < t; j++) { x = x * a;

if (x > m) {

x = x % m;

}

}

if ((x == 1) || (x == m - 1)) { continue;

}

for (int l = 0; l < s - 1; l++) { x = (x * x) % m;

if (x == 1) {

cout << "Число составное" << endl; exit(0);

}

if (x == m - 1) { break;

}

}

if (x == m - 1) { continue;

}

cout << "Число составное" << endl; exit(0);

}

cout << "Число вероятно простое" << endl; cout << "Вероятность того, что " << m;

cout << " составное, не превосходит " << pow(4, -r) << endl;

}

7