Реализовать шифрование и дешифрование шифром Вернама - C#

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

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

Разработать алгоритмы шифрования и дешифрования блока (потока) открытого текста заданной длины из алфавита Zn на заданном ключе с помощью метода, указанного в варианте. Написать программу, реализующую шифрование на заданном ключе открытого текста, состоящего из символов заданного алфавита. Вот блин, я ничего вообще не понимаю. Можно хотя бы просто обычный код. В интернете много всяких версий, причем они не понятны и не правильные.

Решение задачи: «Реализовать шифрование и дешифрование шифром Вернама»

textual
Листинг программы
class Program
{
    static void Main(string[] args)
    {
        Example1();
        Console.WriteLine();
        Example2();
        Console.ReadKey();
    }
 
    static void Example1()
    {
        string alph = "abcdefghijklmnopqrstuvwxyz";
        string text = "hello";
        string key = "xmckl";
 
        var pad = new OnTimePad(alph);
        string encrypt = pad.Crypt1(text, key, true);
        string decrypt = pad.Crypt1(encrypt, key, false);
 
        Console.WriteLine("Оригинал: ");
        Console.WriteLine("Шифротекст: " + encrypt);
        Console.WriteLine("Расшифровка: " + decrypt);
    }
 
    static void Example2()
    {
        string alph = "абвгдежзийклмнопрстуфхцчшыьэюя ."; // нет букв ё ъ щ
        string text = "мама мыла раму.";
        string key = "кофе";
 
        var pad = new OnTimePad(alph);
        string encrypt = pad.Crypt2(text, key);
        string decrypt = pad.Crypt2(encrypt, key);
 
        Console.WriteLine("Оригинал: ");
        Console.WriteLine("Шифротекст: " + encrypt);
        Console.WriteLine("Расшифровка: " + decrypt);
    }
}
 
class OnTimePad
{
    Dictionary<char, int> alph = new Dictionary<char,int>();
    Dictionary<int, char> alph_r = new Dictionary<int, char>();
 
    public OnTimePad(IEnumerable<char> Alphabet)
    {
        int i = 0;
        foreach(char c in Alphabet)
        {
            alph.Add(c, i);
            alph_r.Add(i++, c);
        }
    }
 
    /// <summary>
    /// Версия с английской википедии, где используется операция +
    /// нужно явно указать чего хотим - расшифровать или зашифровать
    /// </summary>
    public string Crypt1(string Text, string Key, bool Crypt)
    {
        char[] key = Key.ToCharArray();
        char[] text = Text.ToCharArray();
        var sb = new StringBuilder();
 
        for (int i = 0; i < text.Length; i++)
        {
            int idx;
            if (alph.TryGetValue(text[i], out idx))
            {
                int r = alph.Count + idx;
                r += (Crypt ? 1 : -1) * alph[key[i % key.Length]];
                sb.Append(alph_r[r % alph.Count]);
            }
        }
 
        return sb.ToString();
    }
        
    /// <summary>
    /// Версия с оператором xor
    /// 
    /// Желательно, чтобы длина алфавита была степень двойки (например 32)
    /// </summary>
    public string Crypt2(string Text, string Key)
    {
        char[] key = Key.ToCharArray();
        char[] text = Text.ToCharArray();
        var sb = new StringBuilder();
 
        for (int i = 0; i < text.Length; i++)
        {
            int ind;
            if (alph.TryGetValue(text[i], out ind))
            {
                sb.Append(alph_r[(ind ^ alph[key[i % key.Length]]) % alph.Count]);
            }
        }
 
        return sb.ToString();
    }
}

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


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

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

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