public static void execute() { log.Info("Задание №4. Функция хеширования. Найти хеш–образ своей Фамилии, используя хеш–функцию\nH_i =〖(H_(i - 1) + M_i)〗^2 mod n\nгде n = pq, p, q взять из Задания №3.\n"); log.Info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); Console.Clear(); Console.WriteLine("Задание №4"); Console.Write("Введите p -> "); int p = Convert.ToInt32(Console.ReadLine()); log.Info("p = {}", p); Console.Write("Введите q -> "); int q = Convert.ToInt32(Console.ReadLine()); log.Info("q = {}", q); Console.Write("Введите номер варианта -> "); int H = Convert.ToInt32(Console.ReadLine()); log.Info("H = {}", H); int n = p * q; log.Info("n = p*q = {}", n); Console.Write("Введите сообщение -> "); string text = Console.ReadLine(); log.Info("Сообщение = {}", text); Console.WriteLine("Хэш {0} -> {1}\n", text, Convert.ToString(HELP.getHash(text, H, n, log))); log.Info("Хэш {0} -> {1}", text, Convert.ToString(HELP.getHash(text, H, n, log))); Console.WriteLine("Подробности в логах."); Console.WriteLine("Чтобы вернуться в меню нажмите Enter..."); Console.ReadLine(); }
private static List <int> reducingX0(string x0_bi) { List <int> X0_bi = HELP.str2list(x0_bi); for (int i = 7; i < X0_bi.Count; i += 8) { X0_bi[i] = -1; } X0_bi[X0_bi.Count - 2] = -1; X0_bi.RemoveAll(x => x == -1); return(X0_bi); }
private static List <int> replace(List <int> suma) { List <int> res = new List <int>(); int counter = 7; for (int i = 0; i < 32; i += 4, counter--) { int znach = suma[i] * 8 + suma[i + 1] * 4 + suma[i + 2] * 2 + suma[i + 3]; string binZnach = Convert.ToString(HELP.s[znach][counter], 2).PadLeft(4, '0'); res.AddRange(HELP.str2list(binZnach)); } return(res); }
public static void execute() { log.Info("Задание №2. Алгоритм шифрования ГОСТ 28147-89. Выполните первый цикл\nалгоритма шифрования ГОСТ 28147 89 в режиме простой замены. Для\nполучения 64 бит исходного текста используйте 8 первых букв из своих\nданных: Фамилии Имени Отчества. Для получения ключа (256 бит)\nиспользуют текст, состоящий из 32 букв. Первый подключ содержит первые 4 буквы.\n"); log.Info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); Console.Clear(); Console.WriteLine("Задание №2"); //Ввод и перевод в двоичную систему Console.Write("Введите исходный текст (8 букв) -> "); string TXT = Console.ReadLine(); string TXT_bi = HELP.getBiFromStr(TXT); log.Info("Перевод входящего сообщения {0} в двоичный код (кодировка ASCII) = {1}\n", TXT, TXT_bi); Console.Write("Введите подключ (4 букв) -> "); string x0 = Console.ReadLine(); string x0_bi = HELP.getBiFromStr(x0); log.Info("Перевод подключа {0} в двоичный код (кодировка ASCII) = {1}\n", x0, x0_bi); List <int> L0 = HELP.getL0(HELP.str2list(TXT_bi)); log.Info("L0 = {}", HELP.list2str(L0)); List <int> R0 = HELP.getR0(HELP.str2list(TXT_bi)); log.Info("R0 = {}", HELP.list2str(R0)); List <int> sum_mod_32 = F_R0X0(R0, HELP.str2list(x0_bi)); log.Info("Результат суммирования R0 + X0 по mod 2^32 = {0}\n", HELP.list2str(sum_mod_32)); sum_mod_32 = replace(sum_mod_32); log.Info("Результат суммирования R0 + X0 по mod 2^32 преобразуем в блоке подстановки.\nРезультат подстановки = {0}\n", HELP.list2str(sum_mod_32)); sum_mod_32 = leftShift(sum_mod_32); log.Info("После циклического сдвига на 11 = {0}\n", HELP.list2str(sum_mod_32)); long a = Convert.ToInt64(HELP.list2str(L0), 2); long b = Convert.ToInt64(HELP.list2str(sum_mod_32), 2); long R1 = a ^ b; log.Info("Результат. R1 = {0}", Convert.ToString(R1, 2).PadLeft(32, '0')); Console.WriteLine("Результат R1 = {0}", Convert.ToString(R1, 2).PadLeft(32, '0')); Console.WriteLine("Подробности в логах."); Console.WriteLine("Чтобы вернуться в меню нажмите Enter..."); Console.ReadLine(); }
private static List <int> F_R0X0(List <int> r0, List <int> x0) { List <int> res; string R0 = ""; r0.ForEach(m => R0 += m); string X0 = ""; x0.ForEach(m => X0 += m); long a = Convert.ToInt64(R0, 2); long b = Convert.ToInt64(X0, 2); long maska = 0b11111111111111111111111111111111; res = HELP.str2list(Convert.ToString(sumMOD32(a, b) & maska, 2)); return(res); }
private static List <int> substitutionsSBox(List <int> sumXORO) { List <int> result = new List <int>(); int row, column; row = sumXORO[0] * 2 + sumXORO[5]; column = sumXORO[1] * 8 + sumXORO[2] * 4 + sumXORO[3] * 2 + sumXORO[4]; int fromS1 = HELP.sBox1[row][column]; result.AddRange(HELP.str2list(Convert.ToString(fromS1, 2).PadLeft(4, '0'))); log.Info("s-box1: Строка-{0} Столбец-{1} Значиение-{2}-{3}", row, column, fromS1, Convert.ToString(fromS1, 2).PadLeft(4, '0')); row = sumXORO[6] * 2 + sumXORO[11]; column = sumXORO[7] * 8 + sumXORO[8] * 4 + sumXORO[9] * 2 + sumXORO[10]; int fromS2 = HELP.sBox2[row][column]; result.AddRange(HELP.str2list(Convert.ToString(fromS2, 2).PadLeft(4, '0'))); log.Info("s-box2: Строка-{0} Столбец-{1} Значиение-{2}-{3}", row, column, fromS2, Convert.ToString(fromS2, 2).PadLeft(4, '0')); row = sumXORO[12] * 2 + sumXORO[17]; column = sumXORO[13] * 8 + sumXORO[14] * 4 + sumXORO[15] * 2 + sumXORO[16]; int fromS3 = HELP.sBox3[row][column]; result.AddRange(HELP.str2list(Convert.ToString(fromS3, 2).PadLeft(4, '0'))); log.Info("s-box3: Строка-{0} Столбец-{1} Значиение-{2}-{3}", row, column, fromS3, Convert.ToString(fromS3, 2).PadLeft(4, '0')); row = sumXORO[18] * 2 + sumXORO[23]; column = sumXORO[19] * 8 + sumXORO[20] * 4 + sumXORO[21] * 2 + sumXORO[22]; int fromS4 = HELP.sBox4[row][column]; result.AddRange(HELP.str2list(Convert.ToString(fromS4, 2).PadLeft(4, '0'))); log.Info("s-box4: Строка-{0} Столбец-{1} Значиение-{2}-{3}", row, column, fromS4, Convert.ToString(fromS4, 2).PadLeft(4, '0')); row = sumXORO[24] * 2 + sumXORO[29]; column = sumXORO[25] * 8 + sumXORO[26] * 4 + sumXORO[27] * 2 + sumXORO[28]; int fromS5 = HELP.sBox5[row][column]; result.AddRange(HELP.str2list(Convert.ToString(fromS5, 2).PadLeft(4, '0'))); log.Info("s-box5: Строка-{0} Столбец-{1} Значиение-{2}-{3}", row, column, fromS5, Convert.ToString(fromS5, 2).PadLeft(4, '0')); row = sumXORO[30] * 2 + sumXORO[35]; column = sumXORO[31] * 8 + sumXORO[32] * 4 + sumXORO[33] * 2 + sumXORO[34]; int fromS6 = HELP.sBox6[row][column]; result.AddRange(HELP.str2list(Convert.ToString(fromS6, 2).PadLeft(4, '0'))); log.Info("s-box6: Строка-{0} Столбец-{1} Значиение-{2}-{3}", row, column, fromS6, Convert.ToString(fromS6, 2).PadLeft(4, '0')); row = sumXORO[36] * 2 + sumXORO[41]; column = sumXORO[37] * 8 + sumXORO[38] * 4 + sumXORO[39] * 2 + sumXORO[40]; int fromS7 = HELP.sBox7[row][column]; result.AddRange(HELP.str2list(Convert.ToString(fromS7, 2).PadLeft(4, '0'))); log.Info("s-box7: Строка-{0} Столбец-{1} Значиение-{2}-{3}", row, column, fromS7, Convert.ToString(fromS7, 2).PadLeft(4, '0')); row = sumXORO[42] * 2 + sumXORO[47]; column = sumXORO[43] * 8 + sumXORO[44] * 4 + sumXORO[45] * 2 + sumXORO[46]; int fromS8 = HELP.sBox8[row][column]; result.AddRange(HELP.str2list(Convert.ToString(fromS8, 2).PadLeft(4, '0'))); log.Info("s-box8: Строка-{0} Столбец-{1} Значиение-{2}-{3}", row, column, fromS8, Convert.ToString(fromS8, 2).PadLeft(4, '0')); return(result); }
public static void execute() { log.Info("Задание №1. Алгоритм шифрования DES. Выполните первый цикл алгоритма\nшифрования DES. Для получения 64 бит исходного текста используйте 8\nпервых букв из своих данных: Фамилии Имени Отчества. Для получения\nключа (256 бит) используют текст, состоящий из 32 букв.\n"); log.Info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); Console.Clear(); Console.WriteLine("Задание №1"); //Ввод и перевод в двоичную систему Console.Write("Введите исходный текст (8 букв) -> "); string TXT = Console.ReadLine(); string TXT_bi = HELP.getBiFromStr(TXT); Console.Write("Введите подключ (7 букв) -> "); string X0 = Console.ReadLine(); string X0_bi = HELP.getBiFromStr(X0); //Логируем промежуточные значение log.Info("Перевод входящего сообщения {0} в двоичный код (кодировка ASCII) = {1}\n", TXT, TXT_bi); log.Info("Перевод первого подключа {0} в двоичный код (кодировка ASCII) X0 = {1}\n", X0, X0_bi); List <int> x0 = reducingX0(X0_bi); log.Info("Уменьшаем длину ключа X0 до 48 бит\n Результат Х0 = {0}\n", HELP.list2str(x0)); List <int> txt_bi = replaceTXT(HELP.str2list(TXT_bi)); log.Info("Выполняем операцию перестановки битовой последовательности исходного сообщения.\nРезультат = {0}\n", HELP.list2str(txt_bi)); List <int> L0 = HELP.getL0(txt_bi); log.Info("Получаем L0 = {0}\n", HELP.list2str(L0)); List <int> R0 = HELP.getR0(txt_bi); log.Info("Получаем R0 = {0}\n", HELP.list2str(R0)); R0 = extendingR0(R0); log.Info("Расширенный R0 = {0}\n", HELP.list2str(R0)); long a = Convert.ToInt64(HELP.list2str(R0), 2); long b = Convert.ToInt64(HELP.list2str(x0), 2); List <int> sumXORO = HELP.str2list(Convert.ToString(a ^ b, 2)); while (sumXORO.Count < 48) { sumXORO.Insert(0, 0); } log.Info("Результат сложения X0 и R0 = {0}\n", HELP.list2str(sumXORO)); sumXORO = substitutionsSBox(sumXORO); log.Info("Результат подстановок из таблиц = {0}\n", HELP.list2str(sumXORO)); sumXORO = replaceAfterSbox(sumXORO); log.Info("Результат перестановки = {0}\n", HELP.list2str(sumXORO)); sumXORO.AddRange(L0); log.Info("Обхединение R и L = {0}\n", HELP.list2str(sumXORO)); List <int> result = permutations(sumXORO); log.Info("Итоговая перестановка. Результат = {0}\n", HELP.list2str(result)); Console.WriteLine("Результат = {0}", HELP.list2str(result)); Console.WriteLine("Подробности решения в логах."); Console.WriteLine("Чтобы вернуться в меню нажмите Enter..."); Console.ReadLine(); }
public static void execute() { log.Info("Задание №5. Электронная цифровая подпись. Используя хеш-образ своей Фамилии, вычислите электронную цифровую подпись по схеме RSA.\n"); log.Info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); Console.Clear(); Console.WriteLine("Задание №5"); Console.Write("Введите p -> "); int p = Convert.ToInt32(Console.ReadLine()); log.Info("p = {}", p); Console.Write("Введите q -> "); int q = Convert.ToInt32(Console.ReadLine()); log.Info("q = {}", q); Console.Write("Введите номер варианта -> "); int H = Convert.ToInt32(Console.ReadLine()); log.Info("H = {}", H); int n = p * q; log.Info("n = p*q = {}", n); int f_n = (p - 1) * (q - 1); log.Info("Функция Эйлера = {0}", f_n); int param_d = HELP.getD(f_n); log.Info("d = {0}", f_n); int param_e = HELP.getE(param_d, f_n); log.Info("e = {0}", f_n); Console.WriteLine("Открытый ключ = ({0},{1})", param_e, n); log.Info("Открытый ключ ({0},{1})", param_e, n); Console.WriteLine("Секретный ключ = ({0},{1})\n\n", param_d, n); log.Info("Секретный ключ ({0},{1})", param_d, n); Console.Write("Введите сообщение -> "); string text = Console.ReadLine(); log.Info("Сообщение = {}", text); H = HELP.getHash(text, H, n, log); Console.WriteLine("Хэш {0} -> {1}\n", text, Convert.ToString(H)); log.Info("Хэш {0} -> {1}", text, Convert.ToString(H)); int key1 = param_e; int key2 = n; BigInteger b1 = new BigInteger(H); b1 = BigInteger.Pow(b1, key1); b1 %= key2; string ECP = b1.ToString(); Console.WriteLine("ХЕШ {0} -> ЭЦП {1}. (Согласно открытым ключам)\n", Convert.ToString(H), ECP); log.Info("ХЕШ {0} -> ЭЦП {1}. (Согласно открытым ключам)\n", Convert.ToString(H), ECP); key1 = param_d; BigInteger b2 = new BigInteger(Convert.ToInt32(ECP)); b2 = BigInteger.Pow(b2, key1); b2 %= key2; string ECPcheck = b2.ToString(); Console.WriteLine("Проверка ЭЦП {0} -> {1}. (Согласно серктным ключам)\n", ECP, ECPcheck); log.Info("Проверка ЭЦП {0} -> {1}. (Согласно серктным ключам)\n", ECP, ECPcheck); Console.WriteLine("Подробности в логах."); Console.WriteLine("Чтобы вернуться в меню нажмите Enter..."); Console.ReadLine(); }
public static void execute() { log.Info("Задание №3. Алгоритм шифрования RSA. Сгенерируйте открытый и\nзакрытый ключи в алгоритме шифрования RSA, выбрав простые числа p и q\nиз первой сотни. Зашифруйте сообщение, состоящее из ваших инициалов: ФИО.\n"); log.Info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); Console.Clear(); Console.WriteLine("Задание №3"); Console.Write("Введите p -> "); int p = Convert.ToInt32(Console.ReadLine()); log.Info("p = {}", p); Console.Write("Введите q -> "); int q = Convert.ToInt32(Console.ReadLine()); log.Info("q = {}", q); int pq = p * q; log.Info("p*q = {}", pq); int f_n = (p - 1) * (q - 1); log.Info("Функция Эйлера = {0}", f_n); int param_d = HELP.getD(f_n); log.Info("d = {0}", f_n); int param_e = HELP.getE(param_d, f_n); log.Info("e = {0}", f_n); Console.WriteLine("Открытый ключ = ({0},{1})", param_e, pq); log.Info("Открытый ключ ({0},{1})", param_e, pq); Console.WriteLine("Секретный ключ = ({0},{1})\n\n", param_d, pq); log.Info("Секретный ключ ({0},{1})", param_d, pq); Console.WriteLine("Шифрование\n"); Console.Write("Введите текст шифруемого сообщения -> "); byte[] text = Encoding.GetEncoding(1251).GetBytes(Console.ReadLine()); string code = ""; foreach (byte temp in text) { BigInteger b = new BigInteger(temp); b = BigInteger.Pow(b, param_e); b %= pq; code += b.ToString() + ","; } code = code.Remove(code.Length - 1); Console.WriteLine("Зашифрованное сообщение -> {0}\n\n", code); log.Info("Сообщение {0} -> Шифр {1}", Encoding.GetEncoding(1251).GetString(text), code); Console.WriteLine("Расшифрование\n"); Console.Write("Введите текст зашифрованного сообщения -> "); string encodedText = Console.ReadLine(); byte[] decodedText = new byte[encodedText.Split(',').Length]; int counter = 0; foreach (string temp in encodedText.Split(',')) { int num = Convert.ToInt32(temp); BigInteger b = new BigInteger(num); b = BigInteger.Pow(b, param_d); b %= pq; decodedText[counter++] = Convert.ToByte(b.ToString()); } Console.WriteLine("Расшифрованное сообщение -> {0}\n\n", Encoding.GetEncoding(1251).GetString(decodedText)); log.Info("Шифр {0} -> Сообщение {1}\n", encodedText, Encoding.GetEncoding(1251).GetString(decodedText)); Console.WriteLine("Подробности в логах."); Console.WriteLine("Чтобы вернуться в меню нажмите Enter..."); Console.ReadLine(); }