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