using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication8
{
class Program
{
static List<byte> URusa = new List<byte>(256);
static List<byte> temp2 = new List<byte>(256);
static byte[,] URusa2 = new byte[16, 16];
static string crypt, decrypt, _temp;
static int t, x1, x2, y1, y2;
public static void SimbolPoc(char s, out int x, out int y)
{
x = 0;
y = 0;
for (var i = 0; i < 16; i++)
{
for (var j = 0; j < 16; j++)
{
if (s == URusa2[i, j])
{
x = j; y = i;
}
}
}
}
public static string Playfair_crypt(string s, string key)
{
byte[] key2 = Encoding.GetEncoding(1251).GetBytes(key);
byte k = 0;
for (var i = 0; i <= 255; i++)
{
URusa.Add(k);
k++;
}
/*********************************************************/
for (var i = 0; i < key2.Length; i++)
{
if (!temp2.Contains(key2[i]))
{
temp2.Add(key2[i]);
}
}
for (var i = 0; i < URusa.Count; i++)
{
if (!temp2.Contains(URusa[i]))
{
temp2.Add(URusa[i]);
}
}
t = 0;
for (var i = 0; i < 16; i++)
{
for (var j = 0; j < 16; j++)
{
URusa2[i, j] = temp2[t];
t++;
Console.Write("{0} ", URusa2[i, j]);
}
Console.WriteLine();
}
//просмотр строки по парам символов и вставка разделяющего символа
//"ъ" в случае когда в паре попались одинаковые символы.
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 + 'я';
}
_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);
if (y1 == y2)
{
x1++; x2++;
if (x1 >= 16) x1 = x1 - 16;
if (x2 >= 16) x2 = x2 - 16;
_temp = _temp + URusa2[y1, x1] + URusa2[y2, x2];
}
//Правило2
if (x1 == x2)
{
y1++;
y2++;
if (y1 >= 16) y1 = y1 - 16;
if (y2 >= 16) y2 = y2 - 16;
_temp = _temp + URusa2[y1, x1] + URusa2[y2, x2];
}
//Правило3
if ((x1 != x2) && (y1 != y2)) _temp = _temp + URusa2[y1, x2] + URusa2[y2, x1];
}
crypt = _temp;
return crypt;
}
public static string Playfair_decrypt(string s, string key)
{
byte[] key2 = Encoding.GetEncoding(1251).GetBytes(key);
byte k = 0;
for (var i = 0; i <= 255; i++)
{
URusa.Add(k);
k++;
}
/*********************************************************/
for (var i = 0; i < key2.Length; i++)
{
if (!temp2.Contains(key2[i]))
{
temp2.Add(key2[i]);
}
}
for (var i = 0; i < URusa.Count; i++)
{
if (!temp2.Contains(URusa[i]))
{
temp2.Add(URusa[i]);
}
}
t = 0;
for (var i = 0; i < 16; i++)
{
for (var j = 0; j < 16; j++)
{
URusa2[i, j] = temp2[t];
t++;
}
}
//просмотр строки по парам символов и вставка разделяющего символа
//"ъ" в случае когда в паре попались одинаковые символы.
_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);
if (y1 == y2)
{
x1--;
x2--;
if (x1 < 0) x1 = x1 + 16;
if (x2 < 0) x2 = x2 + 16;
_temp = _temp + URusa2[y1, x1] + URusa2[y2, x2];
}
//Правило2
if (x1 == x2)
{
y1--;
y2--;
if (y1 < 0) y1 = y1 - 16;
if (y2 < 0) y2 = y2 - 16;
_temp = _temp + URusa2[y1, x1] + URusa2[y2, x2];
}
//Правило3
if ((x1 != x2) && (y1 != y2)) _temp = _temp + URusa2[y1, x2] + URusa2[y2, x1];
}
decrypt = _temp;
return decrypt;
}
static void Main(string[] args)
{
Console.WriteLine(Playfair_crypt("Россия", "Форум"));
//Console.WriteLine(Playfair_decrypt(Playfair_crypt("Россик", "Форум"), "Форум"));
}
}
}
Вообщем шифр Плейфейра. Суть задания: У меня есть - Ключ, Строка. Я создаю байтовый массив, записываю ключ в начало своего массива, и у меня получается байтовая матрица - это я сделал. Но когда нужно зашифровать, возникают проблемы, то есть запускается ф-я SimbolPoc(я передаю ей свой символ строки и х1,y1) - которая ищет символ в байтовой матрице и возвращает его номер строки и столбца, в случае если находит. И тут у меня вообще какая-то чепуха происходит с шифрованием, символ правильно не ищется, выдаёт всё время другое что-то.
Сам бади хелп ми плз!