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

Класkeygen

Форма даного класу, як і попереднього, створює ключі для шифрування та дешифрування. Відмінність цих модулів в тому, що в даній формі відбулося невелике нарощення функціоналу. Прості числа pтаqкористувач задає самостійно. Все інше підраховується автоматично та виводиться для перегляду. Наведемо приклад фрагменту коду, що надає ці можливості:

Int64 p,q,n,m;

try

{

p = Convert.ToInt64(txb_p.Text);

q = Convert.ToInt64(txb_q.Text);

}

catch

{

MessageBox.Show(this,

"Помилкавводу!",

"Перевірте!",

MessageBoxButtons.OK,

MessageBoxIcon.Error);

return;

}

if (IsSimple(p) && IsSimple(q))

{

n = p * q;

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

txb_n.Text = n.ToString();

txb_m.Text = m.ToString();

}

else

{

MessageBox.Show(this,

"Помилкавводу! Перевірте введені дані!",

"Перевірте, p та q мають бути простими числами!",

MessageBoxButtons.OK,

MessageBoxIcon.Error);

return;

}

Зпочатку в блок try ми поміщаємо ініціалізацію змінних p та q. Значення, що вводяться в текстбокс форми конвертуються та присвоюються змінним. Якщо ж введені значення були не числового формату, то приведення типу не відбудеться, а замість нього буде згенеровано виключення. Тоді управління буде передано до блокуcatch. Відповідно буде виведено повідомлення про помилку вводу та вихід з методу для повторного вводу.

Якщо ж числа введено далі по коду виконується перевірка обох значень на простоту. Якщо введені значення є простими числами, то буде розраховано nтаm. Якщо ж це не так, то відповідно буде виведено повідомлення про помилку вводу та вихід з методу для повторного вводу.

Класcript_auto

Даний модуль програми безпосередньо виконує сам процесс шифрування. Класcript_auto забезпечує шифрування зовнішніх файлів з будь-яким розширенням. Для роботи даного модуля потрібно тільки вказати шляхи до файлів (що та куди шифрувати) та ключ шифрування/дешифрування в залежності від операції що має виконуватись.

private void btSrcFile_Click(object sender, EventArgs e)

{

dlgOpen.FileName = txbSrcFile.Text;

dlgOpen.ShowDialog();

txbSrcFile.Text = dlgOpen.FileName;

}

private void btNewFile_Click(object sender, EventArgs e)

{

dlgOpen.FileName = txbNewFile.Text;

dlgOpen.ShowDialog();

txbNewFile.Text = dlgOpen.FileName;

}

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

private void btCrypt_Click(object sender, EventArgs e)

{

Int64 key, mod;

try

{

key = Convert.ToInt64(txbKey.Text);

mod = Convert.ToInt64(txbMod.Text);

}

catch

{

MessageBox.Show(this,

"Введені значення невірні!",

"Помилка!",

MessageBoxButtons.OK,

MessageBoxIcon.Error);

return;

}

RSACrypt(txbSrcFile.Text, txbNewFile.Text,

key, mod, true);

}

Дана частина програмного коду описує процес, що відбувається при натисненні кнопки шифрувати(для дешифрування аналогічно крім останнього параметра в методі RSACript()). Перевіряється чи користувач ввів ключ аналогічним способом до тих, про які вже було сказано вище та викликається методRSACript(),який на вхід приймає п’ять параметрів.

Для шифрування та дешифрування використовується функція privatevoidRSACrypt(stringsrc, stringdest, Int64 key, Int64 mod, boolcrypt). Вхідними параметрами вона отримує шляхи до файлів, ключі та булевий параметрcrypt, який має значення true чи falseта в залежності від цього запускає функцію в режимі шифрування чи дешифрування відповідно.

FileStreamsrc_f, dest_f;

try

{

src_f = new FileStream(src, FileMode.Open);

dest_f = new FileStream(dest, FileMode.Create);

}

catch

{

MessageBox.Show(this,

"Неможливо відкрити один з файлів",

"Помилка!",

MessageBoxButtons.OK,

MessageBoxIcon.Error);

return;

}

Даний фрагмент коду знаходиться в функції RSACript() та створює файлові потоки для читання та запису заданих файлів відповідно.

Після виконання всіх дій з файлами працює наступний код:

src_f.Close();

dest_f.Close();

MessageBox.Show(this,

"Операція виконана успішно ",

"RSAShell",

MessageBoxButtons.OK,

MessageBoxIcon.Information);

Закриваємо файли та повідомляємо користувача про успішне закінчення процесу.

Перейдемо до самого процессу шифрування.

if (crypt)

{

Int32 ch;

while ((ch = src_f.ReadByte()) != -1)

{

Int64 a = Convert.ToInt64(ch);

Int64 b = ModExp(a, key, mod);

for (int i = 0; i < 8; i++)

{

bytench = Convert.ToByte((b >>i * 8) & 0xFF);

dest_f.WriteByte(nch);

}

}

}

else

{

Int32 ch;

while ((ch = src_f.ReadByte()) != -1)

{

Int64 b = Convert.ToInt64(ch);

for (inti = 1; i< 8; i++)

{

Int64 tch = Convert.ToInt64(src_f.ReadByte());

b += (tch<< i * 8);

}

Int64 a = ModExp(b, key, mod);

bytench = Convert.ToByte(a & 0xFF);

dest_f.WriteByte(nch);

}

}

Якщо параметр cript дорівнює trueто виконуємо шифрування. В данному випадку дані читаються з файлу по-байтно до тих пір, поки весь файл не буде прочитано. На кожній ітерації циклу зчитується один байт, зашифровується та записується в інший файл. Саме шифрування виконується методом швидкогопіднесення до степеня. Це реалізовано з допомогою зсувів(побітових операцій).