SkazOff Blog

Шифр Белазо

Такс значит запись больше тестовая (новый модуль для ВП подключил, чтоб код нормально отображался), но все же хоть какую-то смысловую нагрузку несет. Для примера взял реализацию шифра Белазо. Язык 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 и получаем итоговую (расшифрованную строку).

Думаю по коду комменты никакие не нужны т.к. тут проще некуда и все комменты сведутся к объяснениям что такое строка, условия и прочие основы основ. Если кому то этого мало — пишите, скину исходники.

Оставить комментарий