RSA. Применить полученные ключи к считанному массиву байтов - C#
Формулировка задачи:
Здравствуйте, тем на данному вопросу много,но так и не разобрался. Суть:реализация шифрования/дешифрования файла любого типа(jpeg,txt,exe). Генерация пар:открытый/закрытый ключ(E,N)&(D,N), выполнена.(24 битные ключи). Вопрос:не до конца понимаю как правильно "применить" полученные ключи к считанному массиву байтов( блоки по 3 байта).
//генерация ключей,если нужна. int P = 0, Q = 0, N = 0, F, D, E; public string path_to_encrypt_file; private void button1_Click(object sender, EventArgs e) // генерация ключей пользователя А { Random rnd = new Random(); do { P = rnd.Next(128, 255); // генерация 8 битного числа } while (IsPrime(P)); do { Q = rnd.Next(32768, 65535); // генерация 16 битного числа } while (IsPrime(P)); textBox1.Text = Convert.ToString(P) + " " + Convert.ToString(Q); N = P * Q; F = (P - 1)*(Q - 1); do { D = rnd.Next(2, F - 1); } while (IsPrime(D)); // если D простое,оно взаимнопростое с F E = GenerationOfD(D, F); // генерация Е по формуле e*d mod F=1 } public static bool IsPrime(int A) //Проверка на простоту { for(int i=2;i<Math.Sqrt(A)+1;i++) if ((A % i) == 0) return true; return false; } public static int GenerationOfD(int D, int F) { int E = 0; int Res = 0; for(E=1;;E++) { Res = (E *D) % F; if (Res == 1) break; } return E; } public static int ModPow(int a, int b, int c) // А число возводимое в степень, Б степень, С остаток от деления. // Метод ModPow ручками { int d = a % c, e = a % c; for (int i = 0; i < b - 1; i++) { d = d * e % c; } return d; }
Решение задачи: «RSA. Применить полученные ключи к считанному массиву байтов»
textual
Листинг программы
private void button3_Click(object sender, EventArgs e) { FileStream fl = new FileStream(path_to_encrypt_file,FileMode.Open,FileAccess.Read); int len = (int)fl.Length; string path2 = path_to_encrypt_file; byte[] buf = new byte[len]; byte[] bufen = new byte[len]; int step = 0; int encord = 0; while (len > 0) { if (step >= len) break; int n = fl.Read(buf, step, 3); if (n == 0) break; step += n; len -= n; step -= 3; encord = BitConverter.ToInt32(buf, step); encord = ModPow(encord, D, N); bufen[step] = Convert.ToByte(encord); step += 3; } path2 += "encoded"; File.WriteAllBytes(path2, bufen); fl.Close(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д