Шифрование частотным алфавитом - C#

Узнай цену своей работы

Формулировка задачи:

Разработать программное приложение, позволяющее производить шифрование текста на основе частотного алфавита. Пользователю выдается два текста. Один текст предназначен для шифрования, второй текстуризациях будет являться ключом цифровая. На основе второго текста строится частотный алфавит, по следующему принципу: подсчитывается количество всех символов в тексте и исходя из количества производиться сортировка по возрастанию( убыванию). В результате на первом месте частотного алфавита будет стоять символ с наибольшим (наименьшем) количеством повторений в тексте, на последнем - с наименьшим (наибольшим) количеством повторений. Процесс шифрования заключается в замене первого символа алфавита на первый символ частотного алфавита. Процесс дешифрования заключается в обратном.Для того чтобы была возможность шифрования, конечному пользователю также необходимо передавать текст ключа. Я в этом полный ноль, помогите ((

Решение задачи: «Шифрование частотным алфавитом»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication7
{
    class Program
    {
 
        static void Main(string[] args)
        {
 
            // Один текст предназначен для шифрования
            var text = "Decompress"
                .ToLower()
                .ToCharArray();
 
            // На основе второго текста строится частотный алфавит
            var text2 = "IEnumerable<char> Decrypt(IEnumerable<char> text, IEnumerable<char> alphKey"
                .ToLower()
                .ToCharArray();
 
            // строится частотный алфавит
            var freqKey = MyCryptor.SelectByFrequency(text2);
 
            // замена первого символа алфавита  на первый символ частотного алфавита
            var key = MyCryptor.CreateKey(freqKey);
 
            Console.Write("Text: ");
            Console.WriteLine(String.Join("", text));
 
            // Процесс шифрования
            text = MyCryptor.Encrypt(text, key).ToArray();
 
            Console.Write("Encrypted text: ");
            Console.WriteLine(String.Join("", text));
 
            // Процесс дешифрования
            text = MyCryptor.Decrypt(text, key).ToArray();
 
            Console.Write("Decrypted text: ");
            Console.WriteLine(String.Join("", text));
 
            Console.ReadKey(true);
        }
 
        public class MyCryptor
        {
            static readonly char[] alphabeth = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
 
            public static IEnumerable<char> SelectByFrequency(IEnumerable<char> arr)
            {
                return arr.Where(Char.IsLetter).GroupBy(n => n)
                                .OrderByDescending(g => g.Count())
                                .Select(g => g.Key);
            }
 
            public static IEnumerable<char> CreateKey(IEnumerable<char> arr)
            {
                var alph = (char[])alphabeth.Clone();
                int pos = 0, i = 0;
                foreach (var item in arr)
                {
                    if ((pos = Array.IndexOf(alph, item)) != -1)
                    {
                        Swap(ref alph[i], ref alph[pos]);
                    }
                    i++;
                }
 
                return alph;
            }
 
            public static IEnumerable<char> Encrypt(IEnumerable<char> text, IEnumerable<char> alphKey)
            {
                var str = text.ToArray();
                var key = alphKey.ToArray();
                int pos = 0;
                for (int i = 0; i < str.Length; i++)
                {
                    if ((pos = Array.IndexOf(alphabeth, str[i])) != -1)
                        str[i] = key[pos];
                }
                return str;
            }
            public static IEnumerable<char> Decrypt(IEnumerable<char> text, IEnumerable<char> alphKey)
            {
                var str = text.ToArray();
                var key = alphKey.ToArray();
                int pos = 0;
                for (int i = 0; i < str.Length; i++)
                {
                    if ((pos = Array.IndexOf(key, str[i])) != -1)
                        str[i] = alphabeth[pos];
                }
                return str;
            }
 
            static void Swap<T>(ref T lhs, ref T rhs)
            {
                T temp = lhs;
                lhs = rhs;
                rhs = temp;
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.533 из 5
Похожие ответы