コード例 #1
0
ファイル: BinaryPow.cs プロジェクト: InColumi/FirstLabaCMK
        /// <summary>
        /// Возводит и возвращает число number в степень pow по модулю mod
        /// </summary>
        /// <param name="number">число</param>
        /// <param name="pow">степень</param>
        /// <param name="mod">модуль</param>
        /// <returns></returns>
        public static int GetNumber(int number, int pow, int mod)
        {
            List <int> numberInBinary = Converter.GetNumberFromDecimalToBinary(pow);
            int        result         = 1;

            for (int i = 0; i < numberInBinary.Count; i++)
            {
                int result2 = MathMethods.GetModulo(result * result, mod);
                result = (numberInBinary[i] == 0) ? result2 : MathMethods.GetModulo(result2 * number, mod);
            }
            return(result);
        }
コード例 #2
0
ファイル: MillerRabin.cs プロジェクト: InColumi/FirstLabaCMK
        public static void ShowHowInTask(int number, int countOftries, int x)
        {
            int s = GetS(number);
            int t = number - 1;

            int randNumber;

            for (int i = 0; i < countOftries; i++)
            {
                randNumber = x;
                int y = BinaryPow.GetNumber(randNumber, t, number);

                if (y == 1 || y == number - 1)
                {
                    continue;
                }
                Console.WriteLine($"x = {x}");
                for (int j = 1; j < s; j++)
                {
                    Console.WriteLine($"\ty{j} = {y}");
                    y = MathMethods.GetModulo(y * y, number);

                    if (y == 1)
                    {
                        Console.WriteLine($"{number} is  not prime!");
                    }

                    if (y == number - 1)
                    {
                        break;
                    }
                }

                if (y != number - 1)
                {
                    Console.WriteLine($"{number} is  not prime!");
                }
            }
            Console.WriteLine($"{number} is prime!");
        }
コード例 #3
0
ファイル: MillerRabin.cs プロジェクト: InColumi/FirstLabaCMK
        public static bool IsPrimeNumber(int number, int countOftries)
        {
            int s = GetS(number);
            int t = number - 1;

            int randNumber;

            for (int i = 0; i < countOftries; i++)
            {
                randNumber = _rand.Next(1, number);
                int y = BinaryPow.GetNumber(randNumber, t, number);

                if (y == 1 || y == number - 1)
                {
                    continue;
                }

                for (int j = 1; j < s; j++)
                {
                    y = MathMethods.GetModulo(y * y, number);

                    if (y == 1)
                    {
                        return(false);
                    }

                    if (y == number - 1)
                    {
                        break;
                    }
                }

                if (y != number - 1)
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #4
0
        static void Main(string[] args)
        {
            #region Laba123

            //ShowArray(SieveEratosthenes.GetPrimeNumbers(10));
            //SieveEratosthenes.ShowPrimeNumbers(1729);

            //foreach (var item in Converter.GetNumberFromDecimalToBinary(33))
            //{
            //    Console.Write(item);
            //}

            //Console.WriteLine(BinaryPow.GetNumber(1920, 1021, 3551));
            //Console.WriteLine(BinaryPow.GetNumber(1805, 1021, 3551));
            //Console.WriteLine(BinaryPow.GetNumber(0013, 1021, 3551));

            //Console.WriteLine(MillerRabin.IsPrimeNumber(907, 999));

            //int n = 15;
            //MillerRabin.ShowHowInTask(n, 1, 2);
            //MillerRabin.ShowHowInTask(n, 1, 3);
            //MillerRabin.ShowHowInTask(n, 1, 5);
            //MillerRabin.ShowHowInTask(n, 1, 7);
            #endregion
            #region Laba4

            Random rand     = new Random();
            string alphabet = GetAlphaBet();
            Console.WriteLine(alphabet);

            int p;  // простое число
            int q;  // число по исловию q < p - 1  rand.Next(1, p);
            int a;  // секретное числое абонента А из интервала (1, p- 1) rand.Next(1, p);
            int r;  // секретное числое абонента B из интервала (1, p- 1) rand.Next(1, p);
            int h;  // Участник A выбирает свой секретный ключ a,
                   // вычисляет величину (h = q^a mod p) и пересылает информацию участнику B
            int c1; // Участник B выбирает свой ключ r,
                    // вычисляет величину (с1 = q^r mod p) и отправляет r, C1 участнику A
            int c2; // Участник A, получив величины r и C1,
                    // зашифровывает информацию M по формуле (С2 = M * h^r mod p)
                    // и отсылает ее участнику B криптотекст С (с1, с2);
            p = 23;
            q = rand.Next(1, p);
            // A пересылает(h) B
            a = rand.Next(1, p);
            h = BinaryPow.GetNumber(q, a, p);
            Console.WriteLine($"A пересылает(h = {h}) B");


            // B пересылает(r, c1) A
            r  = rand.Next(1, p);
            c1 = BinaryPow.GetNumber(q, r, p);
            Console.WriteLine($"B пересылает(r = {r}, c1 = {c1}) A");
            // A шифрует
            int M = 7;
            c2 = MathMethods.GetModulo(M * BinaryPow.GetNumber(h, r, p), p);
            Console.WriteLine($"A шифрует M = {M} и пересылает(c1 = {c1}, c2 = {c2})");
            // B дешифрует
            int D;
            //D =
            //    Console.WriteLine($"B дешифрует");
            #endregion

            Console.ReadKey();
        }