コード例 #1
0
        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();
        }
コード例 #2
0
ファイル: Num1.cs プロジェクト: VictorGolubev/myKMZI
        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);
        }
コード例 #3
0
ファイル: Num2.cs プロジェクト: VictorGolubev/myKMZI
        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);
        }
コード例 #4
0
ファイル: Num2.cs プロジェクト: VictorGolubev/myKMZI
        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();
        }
コード例 #5
0
ファイル: Num2.cs プロジェクト: VictorGolubev/myKMZI
        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);
        }
コード例 #6
0
ファイル: Num1.cs プロジェクト: VictorGolubev/myKMZI
        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);
        }
コード例 #7
0
ファイル: Num1.cs プロジェクト: VictorGolubev/myKMZI
        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();
        }
コード例 #8
0
ファイル: Num5.cs プロジェクト: VictorGolubev/myKMZI
        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();
        }
コード例 #9
0
        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();
        }