Реализовать шифрование и дешифрование шифром Вернама - 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(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д