Нижегородский Государственный Технический Университет Лабораторная работа №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