Такс значит запись больше тестовая (новый модуль для ВП подключил, чтоб код нормально отображался), но все же хоть какую-то смысловую нагрузку несет. Для примера взял реализацию шифра Белазо. Язык C#.
Шифр Белазо является симметричным криптоалгоритмом. Т.е. в преобразованиях симметричных криптосистем используется один и тот же ключ для кодирования информации отправителем и для декодирования информации получателем.
В простейшем случае в качестве алгоритма подстановки может использоваться замена одного символа алфавита другим символом в соответствии с ключом.
Итальянцем Жованом Белазо в 1553 году был предложен шифр с использованием ключа, который записывался периодически над буквами открытого текста, указывая номер строки в таблице Тритемия, по которой следует производить замену этой буквы.
Итак. Создаем два массива (собственно сам алфавит, и таблицу для кодирования):
Char[] mas_alf = { 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ы', 'ъ', 'э', 'ю', 'я' }; Char[,] tabTritemii=new Char[32,32];
Генерируем таблицу:
private void TritemiiGeneration() { int n=0, k=0; for (int i = 0; i < 32; i++) { k = n; for (int j = 0; j < 32; j++) { if (k == 32) k = 0; tabTritemii[i, j] = mas_alf[k]; k++; } n++; } }
Сама процедура кодирования
if (!TextBoxBaseString.Text.Equals("") && !TextBoxKeyWord.Text.Equals("")) { StringBuilder str = new StringBuilder(TextBoxBaseString.Text); StringBuilder key = new StringBuilder(TextBoxKeyWord.Text); StringBuilder code = new StringBuilder(); int j = 0; for (int i = 0; i < str.Length; i++) { if (str[i] != ' ') { if (j == key.Length) j = 0; code.Append(tabTritemii[(int)key[j] - 1072, (int)str[i] - 1072]); j++; } else code.Append(' '); } TextBoxEncodedString.Text = code.ToString(); } else MessageBox.Show("Введите исходную строку и ключ");
И декодирование
if (!TextBoxEncodedString.Text.Equals("") && !TextBoxKeyWord.Text.Equals("")) { StringBuilder code = new StringBuilder(TextBoxEncodedString.Text); StringBuilder key = new StringBuilder(TextBoxKeyWord.Text); StringBuilder decodedStr = new StringBuilder(); int j = 0; for (int i = 0; i < code.Length; i++) { if (code[i] != ' ') { if (j == key.Length) j = 0; for (int k = 0; k < 32; k++) if (tabTritemii[(int)key[j] - 1072, k].Equals(code[i])) decodedStr.Append(tabTritemii[0, k]); j++; } else decodedStr.Append(' '); } TextBoxDecodedString.Text = decodedStr.ToString(); } else MessageBox.Show("Введите закодированную строку и ключ");
На самом деле все это можно сделать и красивее и проще, например просто через сдвиг индексов, но делалось это за одну пару одной знакомой, а ей такой код как раз наиболее понятен. На картинке слева видно как выглядит итог. Вводим фразу и ключ, клацаем Encode получаем закодированную строку, потом клацаем Decode и получаем итоговую (расшифрованную строку).
Думаю по коду комменты никакие не нужны т.к. тут проще некуда и все комменты сведутся к объяснениям что такое строка, условия и прочие основы основ. Если кому то этого мало — пишите, скину исходники.