Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
опис Комп прог.docx
Скачиваний:
6
Добавлен:
19.02.2016
Размер:
213.81 Кб
Скачать

Клас keygen_auto

Даний клас, як і всі інші також є формою. Всі форми є незалежними одна від одної та не містять спільних змінних, методів чи параметрів. Дана форма створює відкритий та секретний ключі для шифрування. Ключі генеруються автоматично випадковим чином після натискання кнопки «Генерувати» на формі. Поглянемо докладніше на методи, що містяться в даномукласі.

System.Random a = newRandom();

private Int64 GenerateSimple(Random a)

{

Int64 number = a.Next(2, 9999);

do

{

number++;

}

while (!IsSimple(number));

return number;

}

Дана функція генерує випадковим чином просте число в заданному діапазоні. За допомогою Randoma.Next(2,9999) випадковим чином генерується число від 2 до 9999. Потім в циклі з після умовою згенероване число збільшується на одиницю на кожнійітерації до тих пір, поки не буде виконано умову. Якщо ж умова виконується, то функція завершує свою роботу та повертає дане число. Умовою в данному випадку є те, що число маєбути простим. Для перевірки числа на простоту після кожної ітерації циклу викликається метод «IsSimple». Розглянемо роботу данного методу.

privateboolIsSimple(Int64 n)

{

for (Int64 i = 2; i< n; i++)

{

if (n % i == 0)

return false;

}

returntrue;

}

Даний метод булевого типу. Він приймає на вхід число і якщо число є простим повертає результат true, якщо ж ні тоfalse. Перевірка відбувається простим перебором чисел в циклі.

Оскільки механізм створення простого числа зрозумілий розглянемо інші цікаві моменти даного класу.

Int64 p = GenerateSimple(a);

Int64 q = p;

while (q == p)

q = GenerateSimple(a);

Int64 n = p * q;

Int64 m = (p - 1) * (q - 1);

В даній частині коду ми генеруємо прості числа pтаq, знаходимо модульnта функцію Ейлераm.

Далі знаходимо e– відкриту частину ключа таd– закриту частину.Відомо, що е має бути взаємно просте зm. Взаємно прості числа, це натуральні або цілі числа, які не мають спільних дільників більшихза 1, або, інакше кажучи, якщо їх найбільший спільний дільник дорівнює 1. Таким чином,3 і 7 –взаємно прості, а 3 і 6 – ні (діляться на 3). Будь-яке натуральне число взаємно просте з 1.

Якщо p – просте, а n – довільне ціле число, то вони взаємно прості тоді і тілько тоді, коли n неділиться на p. Знаходження найбільшого спільного дільника зручно робити, використовуючиалгоритм Евкліда: маючи два натуральні числа a та b:якщо b = 0, то a є шуканим НСД (Найбільший спільний дільник),інакше повторюємо обчислення для пари b та залишку від ділення a на b (тобто a mod b).

Для наочної демонстрації представлено ітераційну версію, де a > b :

НСД(a, b)

поки b ≠ 0

c := залишок від ділення a на b

a := b

b := c

поверни a

Ось так це реалізовано в даній програмі:

private bool AreCommonlySimple(Int64 a, Int64 b)

{

Int64 c = 1;

while (c != 0)

{

c = a % b;

a = b;

b = c;

}

return (a > 1 ? false : true);

}

Перейдемо безпосередньо до знаходження eтаd.

Int64 ek;

Int64 d;

do

{

do

{

ek = GenerateSimple(a);//Int32.MaxValue / 65536);

}

while (!AreCommonlySimple(m, ek));

Int64 a11, a12, a21, a22, r;

a11 = a22 = 1;

a12 = a21 = 0;

Int64 te = ek;

Int64 tm = m;

while ((r = tm % te) != 0)

{

Int64 t11 = a11;

Int64 t12 = a12;

Int64 t21 = a21;

Int64 t22 = a22;

Int64 qt = tm / te;

a11 = t21;

a12 = t22;

a21 = t11 - t21 * qt;

a22 = t12 - t22 * qt;

tm = te;

te = r;

}

d = a22;

}

while ((ek * d) % m != 1);

Отож, маємо цикл, який виконується до тих пір, поки не будуть знайдені такі числа eтаd, що (e*d) ділилося наm(ось так while ((ek * d) % m != 1)) . Втіліциклумизнаходимое:

do

{

ek = GenerateSimple(a);//Int32.MaxValue / 65536);

}

while (!AreCommonlySimple(m, ek));

простогенеруємовипадковечислодотихпір, покинебудезнайденочисловзаємнопростезm. ДалізнаходимочислоdзадопомогоюрозширеногоалгоритмуЕвклідатаперевіряємокінцевуумову.