Esempio n. 1
0
        /// <summary>
        /// Шифрование символа <paramref name="symbol"/>.
        /// </summary>
        /// <param name="symbol">символ</param>
        /// <param name="b">открытый ключ</param>
        /// <param name="w">последовательность - часть закрытого ключа</param>
        /// <param name="q">часть закрытого ключа</param>
        /// <param name="r">часть закрытого ключа</param>
        /// <param name="converter">преобразователь символа в массив битов</param>
        public static int Encrypt(char symbol, int[] b, int[] w, int q, int r, CharToBitsConverter converter)
        {
            byte[] bits = converter.ToBits(symbol);

            int c = 0;

            for (int i = 0; i < w.Length; ++i)
            {
                c += bits[i] * b[i];
            }

            return(c);
        }
Esempio n. 2
0
        /// <summary>
        /// Расшифровать сообщение <paramref name="x"/>с использованием заданного
        /// конвертера <paramref name="converter"/>.
        /// </summary>
        /// <param name="x">сообщение</param>
        /// <param name="w">последовательность - часть закрытого ключа</param>
        /// <param name="q">часть закрытого ключа</param>
        /// <param name="r">часть закрытого ключа</param>
        /// <param name="converter">преобразователь массива битов в символ</param>
        public static string Decrypt(int[] x, int[] w, int q, int r, CharToBitsConverter converter)
        {
            char[] message = new char[x.Length];

            int s = Calculations.InvertNotCoprimeIntegers(r, q);

            for (int i = 0; i < x.Length; ++i)
            {
                message[i] = Decrypt(x[i], w, s, q, converter);
            }

            return(new string(message));
        }
Esempio n. 3
0
        /// <summary>
        /// Шифрование сообщения <paramref name="s"/> с использованием конвертера.
        /// </summary>
        /// <param name="s">сообщение</param>
        /// <param name="w">последовательность - часть закрытого ключа</param>
        /// <param name="q">часть закрытого ключа</param>
        /// <param name="r">часть закрытого ключа</param>
        /// <param name="converter">преобразователь символа в массив битов</param>
        public static int[] Encrypt(string s, int[] w, int q, int r, CharToBitsConverter converter)
        {
            int[] b = new int[w.Length];
            for (int i = 0; i < b.Length; ++i)
            {
                b[i] = Calculations.ModMultiply(r, w[i], q);
            }

            int[] x = new int[s.Length];
            for (int i = 0; i < s.Length; ++i)
            {
                x[i] = Encrypt(s[i], b, w, q, r, converter);
            }

            return(x);
        }
Esempio n. 4
0
        /// <summary>
        /// Расшифровать символ <paramref name="x"/> с использованием заданного
        /// конвертера <paramref name="converter"/>.
        /// </summary>
        /// <param name="x">зашифрованный символ</param>
        /// <param name="w">последовательность - часть закрытого ключа</param>
        /// <param name="s">обратное к r по модулю q</param>
        /// <param name="q">часть закрытого ключа</param>
        /// <param name="converter">преобразователь массива битов в символ</param>
        static char Decrypt(int x, int[] w, int s, int q, CharToBitsConverter converter)
        {
            byte[] bits = new byte[w.Length];
            int    c    = Calculations.ModMultiply(x, s, q);

            while (c > 0)
            {
                int i = w.Length - 1;
                while (i >= 0 && w[i] > c)
                {
                    --i;
                }
                if (i < 0)
                {
                    break;
                }
                c      -= w[i];
                bits[i] = 1;
            }

            return(converter.ToChar(bits));
        }