msz_lab3x

advertisement
Нижегородский Государственный Технический Университет
Лабораторная работа №3
по дисциплине: «Методы и средства защиты компьютерной информации»
Тема: «Ассиметричные алгоритмы шифрования данных»
Выполнил студент группы 10-В-1
Сидоренко О.О.
Проверил:
Гай В.Е.
г. Нижний Новгород
2013г.
Цель лабораторной работы
Освоить методику работы ассиметричных алгоритмов шифрования, где существует два
ключа – один для шифрования, другой для дешифрования.
Вариант задания на лабораторную работу
8. Реализовать программу для шифрования / дешифрования текстов, работающую по
алгоритму RSA. Программа должна уметь работать с текстом произвольной длины.
Краткие теоретические сведения и описание алгоритма работы
программы
Алгоритм RSA разработан в 1977 г. Роном Ривестом, Ади Шамиром и Ле-ном Адлеманом
и опубликован в 1978 г. С тех пор алгоритм Rivest-Shamir-Adleman (RSA) широко применяется
практически во всех приложениях, использующих криптографию с открытым ключом.
Алгоритм работы:
Создается список простых числе от 0 до 251, из него выбираются два простых числа,
необходимые в алгоритме. Считаются остальные необходимые значения. При помощи
алгоритма Евклида находится Публичный и Приватный ключи, причем список публичных
ключей создается заранее и значение оттуда выбирается случайно.
Шифрование:
Строка исходного текста преобразуется в массив байт, после чего каждый байт
вычисляется по известной формуле – если полученное число будет содержать меньше 5
символов, то пустые места заполнятся слева нулями.
Дешифровка:
Из последовательности цифр формируется числовой массив, затем для каждого элемента
массива выполняется операция, обратная шифрации и значение заносится в байтовый массив.
Затем он преобразовывается в строку и получается зашифрованный текст
2
Листинг разработанной программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Numerics;
using System.Management;
namespace lab4_rsa
{
public partial class Form1 : Form
{
public byte p;
public byte q;
public ushort F;
public Int32 n;//int32?
public ushort e;
public Int32 d;
public Form1()
{
InitializeComponent();
}
public struct EuclideResult
{
public int u1;
public int u2;
public int gcd;
}
public string encode(string text)//encoding text
{
string Str = "";
int encLen;
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
byte[] strBytes = enc.GetBytes(text);
foreach (byte value in strBytes)
{
int encrypt = XYmodN(value, e, n); //c=m^e mod n
if ((encLen=encrypt.ToString().Length) < 5)
{
for (int i = 0; i < 5 - encLen; i++)
Str += "0";
}
Str += encrypt;// +"|";
}
return Str;
}
public string decode(string text) //decoding text
{
string outStr = "";
Int32[] arr = NumArray(text);
byte[] bytes = new byte[arr.Length];
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
int j = 0;
foreach (int value in arr)
{
byte decryptedValue = (byte)XYmodN(value, d, n); //m= c^d mod n
bytes[j] = decryptedValue;
j++;
}
outStr += enc.GetString(bytes);
return outStr;
}
private Int32[] NumArray(string text)
{
3
int i = 0;
Int32[] result = new Int32[text.Length/5];
string tmp = "";
int j = 0;
foreach (char c in text)
{
tmp += c;
j++;
if(j==5)//макимально пять символов в числе
{
result[i] = Int32.Parse(tmp);
tmp = "";
j = 0;
i++;
continue;
}
}
return result;
}
static int XYmodN(int value, int pw, int md)
{
// return (Int32)Math.Pow(value, pw) % md;
int result = value;
for (int i = 0; i < pw - 1; i++)
{
result = (result * value) % md;//если сразу возводить в степень, то возможен выход
за рамки
}
return result;
}
/// Получить все варианты для e
static List<ushort> eList(ushort ph)
{
List<ushort> result = new List<ushort>();
for (ushort i = 2; i < ph; i++)
{
if (Euclide(i, ph).gcd == 1)
{
result.Add(i);
}
}
return result;
}
//Euclide( result - secretkey d)
public static EuclideResult Euclide(int a, int b)//u1 * a + u2 * b = u3
{
int u1 = 1;
int u3 = a;
int v1 = 0;
int v3 = b;
while (v3 > 0)
{
int q0 = u3 / v3;
int q1 = u3 % v3;
int tmp = v1 * q0;
int tn = u1 - tmp;
u1 = v1;
v1 = tn;
u3 = v3;
v3 = q1;
}
int tmp2 = u1 * (a);
tmp2 = u3 - (tmp2);
int res = tmp2 / (b);
EuclideResult result = new EuclideResult()
{
u1 = u1,
u2 = res,
4
gcd = u3
};
return result;
}
//Массив простых чисел в границах x
static private byte[] SimpleList()
{
List<byte> noSimple = new List<byte>();
//последнее простое число тут 251,
//следовательно макимсально возможное n = x*x = 63001, пять знаков
//ushort, к слову, тоже пятизначный
for (int x = 2; x < 256; x++)
{
int n = 0;
for (int y = 1; y <= x; y++)
{
if (x % y == 0)
n++;
}
if (n <= 2)
noSimple.Add((byte)x);
}
return noSimple.ToArray();
}
private void Form1_Load(object sender, EventArgs ea)
{
label1.Text = "Public Key";
label2.Text = "Prvate Key";
label3.Text = "Second number";
Random random = new Random();
byte[] simple = SimpleList();
p = simple[random.Next(0, simple.Length)];
q = simple[random.Next(0, simple.Length)];
n = (ushort)(p * q);
F = (ushort)((p - 1) * (q - 1));
List<ushort> possibleE = eList(F);//List нужен для .add
do
{
e = possibleE[random.Next(0, possibleE.Count)];
d = Euclide(e % F, F).u1;
} while (d < 0);
textBox1.Text = Convert.ToString(e);
textBox2.Text = Convert.ToString(d);
textBox3.Text = Convert.ToString(n);
}
private void button1_Click(object sender, EventArgs e)
{
richTextBox2.Text = encode(richTextBox1.Text);
}
private void button2_Click(object sender, EventArgs e)
{
richTextBox1.Text = decode(richTextBox2.Text);
}
}
}
5
Результаты работы программы
Шифрация текста
Выводы
Реализовал программу для шифрования / дешифрования текстов, работающую по
алгоритму RSA
6
Related documents
Download