Скачиваний:
56
Добавлен:
24.07.2019
Размер:
46.59 Кб
Скачать

Практическая работа №9

Шифрование данных в асимметричной криптосистеме RSA

Цель работы: изучить методы шифрования данных в криптосистеме RSA и освоить их практическое применение.

Ход работы

Задание: Используя алгоритм шифрования данных в криптосистеме RSA, написать программу шифрования и дешифрования произвольного набора символов.

Листинг 1:

using System;

using System.Windows.Forms;

namespace RSA {

public partial class Form1 : Form {

private string alfavit = "абвгдежзиклмнопрстуфхцчшщъыьэюя ";

public Form1() {

InitializeComponent();

}

private int nod(int n1, int n2) {

while (n1 != 0 && n2 != 0) {

if (n1 >= n2) n1 = n1 % n2;

else n2 = n2 % n1;

}

return n1 + n2;

}

private int stepen(int a, int x, int n) {

a++;

int k = 0, otv = 1, find1 = 0;

int b = x & 1;

while (x != 0) {

if (b == 1) {

int rez = a;

for (int i = 2; i <= Math.Pow(2, k); i *= 2) {

rez *= rez;

rez %= n;

}

rez %= n;

if (rez != 0) {

otv *= rez;

find1 = 1;

}

}

x = x >> 1;

k++;

}

if (find1 == 0) otv = 0;

else otv %= n;

return otv;

}

private int obr(int a, int n) {

int [] u = new int[3];

int [] v = new int[3];

int [] t = new int[3];

u[0] = 0; u[1] = 1; u[2] = n;

v[0] = 1; v[1] = 0; v[2] = a;

t[0] = 0; t[1] = 0; t[2] = 0;

while (u[2] != 1) {

int q = u[2] / v[2];

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

t[i] = u[i] - v[i] * q;

u[i] = v[i];

v[i] = t[i];

}

}

return (u[0] + n) % n;

}

private void button1_Click(object sender, EventArgs e) {

int P = Convert.ToInt32(textBox1.Text);

int Q = Convert.ToInt32(textBox2.Text);

string fraza = textBox4.Text;

int K = Convert.ToInt32(textBox3.Text); //открытый ключ

int et = (P - 1) * (Q - 1);

int N = P * Q; //Модуль

int k = obr(K, et);

if (nod(K, et) != 1) {

label1.Text = "Выбранный ключ не подходит для открытого ключа!";

return;

}

int dl_frazy = fraza.Length;

int alf = alfavit.Length;

int[] shifr = new int[dl_frazy];

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

for (int j = 0; j < alf; j++) {

if (alfavit[j] == fraza[i]) {

shifr[i] = stepen(j, K, N);

break;

}

}

}

string[] result = new string[dl_frazy];

result[0] = shifr[0].ToString();

result[0] = string.Concat(result[0], " ");

for (int i = 1; i < dl_frazy; i++) {

result[i] = string.Concat(result[i - 1], Convert.ToString(shifr[i]));

result[i] = string.Concat(result[i], " ");

}

textBox7.Text = string.Concat(result[dl_frazy - 1]);

textBox5.Text = k.ToString();

textBox6.Text = N.ToString();

}

private void button2_Click(object sender, EventArgs e) {

int sp = 0;

string resultat = "";

int N = Convert.ToInt32(textBox6.Text);

int k = Convert.ToInt32(textBox5.Text); //секретный ключ

string shifr = Convert.ToString(textBox7.Text);

int dl_shifra = shifr.Length;

int kol = 0;

for (int i = 0; i < dl_shifra; i++) if (shifr[i] == ' ') kol++;

int[] m = new int[kol + 1];

string[] t = new string[kol + 1];

for (int i = 0; i < kol + 1; i++) {

do {

if (sp == dl_shifra - 1) break;

t[i] = string.Concat(t[i], shifr[sp]);

sp++;

}

while (Convert.ToString(shifr[sp]) != " ");

m[i] = Convert.ToInt32(t[i]);

}

string[] deshifr = new string[kol + 1];

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

int s = stepen(m[i] - 1, k, N);

deshifr[i] = Convert.ToString(alfavit[s - 1]);

resultat = string.Concat(resultat, deshifr[i]);

}

textBox8.Text = Convert.ToString(resultat);

}

}

}

Результат работы программы:

Соседние файлы в папке Практическая работа 9