Шифрование Плейфейра
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class Program
{
static int t, x1, x2, y1, y2;
static string temp;
const int MaxX = 6;//столбцы
const int MaxY = 5;//строки
static string URusa = "абвгдежзиклмнопрстуфхцчшщъыэюя";
//string[] URusa2 = URusa.Split(',');
static char[,] array = new char[MaxY, MaxX];
public static void SimbolPoc(char s, out int x, out int y)
{
x = 0;
y = 0;
for (var i = 0; i < MaxY; i++)
{
for (var j = 0; j < MaxX; j++)
{
if (s == array[i, j])
{
x = j; y = i;
//Environment.Exit;
}
}
}
}
public static void Playfair_crypt(string s, string key)
{
key = key.ToLower();
s = s.ToLower();
//Удаляем из строки все символы, Не входящие в наш алфавит
temp = "";
for (var i = 0; i < s.Length; i++)
{
if (Convert.ToInt32(URusa.Contains(s[i])) != 0)
{
temp += s[i];
}
}
s = temp;
//Создание ключевой матрицы, с использованием ключевого слова "key".
temp = "";
for (var i = 0; i < key.Length; i++)
{
if (Convert.ToInt32(temp.Contains(key[i])) == 0) //!!!!!!!!!!!!!!!!!!!!!
temp += key[i];
}
for (var i = 0; i < URusa.Length; i++)
{
if (Convert.ToInt32(temp.Contains(URusa[i])) == 0) //!!!!!!!!!!!!!!!!!!!!!
temp += URusa[i];
}
t = 0;
for (var i = 0; i < MaxY; i++)
{
for (var j = 0; j < MaxX; j++)
{
array[i, j] = temp[t];
t++;
Console.Write("{0} ", array[i, j]);
}
Console.WriteLine();
}
//Console.WriteLine(s);
//просмотр строки по парам символов и вставка разделяющего символа
//"ъ" в случае когда в паре попались одинаковые символы.
for (var i = 0; i < s.Length / 2; i++)
{
if (s[2 * i] == s[2 * i + 1])
{
s = s.Insert(2 * i + 1, "ъ");
}
}
if (s.Length % 2 == 1)
{
if (s[s.Length - 1] != 'ъ')
s = s + 'ъ';
else
s = s + 'я';
}
//Console.WriteLine(s);
Console.WriteLine(s);
temp = "";
for (var i = 0; i < s.Length / 2; i++)
{
SimbolPoc(s[2 * i], out x1, out y1);
SimbolPoc(s[2 * i + 1], out x2, out y2);
//Console.WriteLine(x1);
//Правило1
if (y1 == y2)
{
x1++;
x2++;
if (x1 > MaxX) x1 = x1 - MaxX;
if (x2 > MaxX) x2 = x2 - MaxX;
temp = temp + array[y1, x1] + array[y2, x2];
}/*
//Правило2
if (x1 == x2)
{
y1++;
y2++;
if (y1 > MaxY) y1 = y1 - MaxY;
if (y2 > MaxY) y2 = y2 - MaxY;
temp = temp + array[y1, x1] + array[y2, x2];
}
//Правило3
if ((x1 != x2) && (y1 != y2)) temp = temp + array[y1, x2] + array[y2, x1];*/
}
Console.WriteLine(temp);
}
static void Main(string[] args)
{
Playfair_crypt("Россия", "Форум");
}
}
}
Выдаёт ошибку на строке Правила1 -
temp = temp + array[y1, x1] + array[y2, x2];
- выходит за границы, до этого шага всё делает вроде бы правильно. Соответственно другие правила тоже закомментил.
Когда мы доходим до этой строки, и если мы уберём s = , оставим просто s.Insert..
То правило 1 срабатывает, строка temp, но оно принимает уже не ту строку, которая мне нужна: с "Ъ" Где-то намудрил с индексами видимо..
s = s.Insert(2 * i + 1, "ъ");
А когда непосредственно доходим до перестановки букв в матрице быкуется( Помогите!