Практические работы Часть 2 / Практическая работа 9 / пр9
.docПрактическая работа №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);
}
}
}
Результат работы программы: