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(); }