Пожалуйста, помогите мне с шифром Playfair (C#)C#

Место общения программистов C#
Ответить
Anonymous
 Пожалуйста, помогите мне с шифром Playfair (C#)

Сообщение Anonymous »

Это шифр playfair, ключевое слово GOLDEN, однако мой алгоритм не может его определить. Он использует частоты тетраграмм для фитнеса. Я предполагаю, что проблема связана с запасом или просто в том, что я использую слишком примитивный код для такой задачи, в любом случае мне нужен способ сделать это.


using System;
using System.IO;
using System.Linq;
namespace keyword_solute
{
class Program
{
static void Main()
{
string path = @"C:\Users\asus\Downloads\english_quadgrams.txt\english_quadgrams.txt";
string[] English_tetragrams = File.ReadAllLines(path);
long[] Eng_tetragram_frequencies = new long[English_tetragrams.Length];
int iteration = 0;
foreach (string line in English_tetragrams)
{
Eng_tetragram_frequencies[iteration] = Convert.ToInt64(line.Remove(0, 5));
English_tetragrams[iteration] = line.Remove(line.IndexOf(' '));
iteration++;
}
long total_engl_frequency = Eng_tetragram_frequencies.Sum();
string Cipher = "EGIWLUQDUOHGKODGRIKTAWTWRDUSERKBDZERNOIRACQUIOIWAHHN";
char[] alphabet = new char []{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
int[,] alphabet_pos = new int[25, 2];
char[,] ParentKey = new char[,] { { 'A', 'B', 'C', 'D', 'E' }, { 'F', 'G', 'H', 'I', 'K' }, { 'L', 'M', 'N', 'O', 'P' }, { 'Q', 'R', 'S', 'T', 'U' }, { 'V', 'W', 'X', 'Y', 'Z' } };
char[,] ChildKey = new char[5, 5];
double BestFitness = fitness_score(Totetragrams(solution(Cipher, ParentKey)), English_tetragrams, Eng_tetragram_frequencies, total_engl_frequency);
Random random = new Random();
double margin = 0.0005D * BestFitness * -1;
int successful= 0;
for (int counter = 0; counter < 30001;)
{
int trow=0;
int tcolumn =0;
foreach(char letter in ParentKey)
{
alphabet_pos[Array.IndexOf(alphabet, letter), 0] = trow;
alphabet_pos[Array.IndexOf(alphabet, letter), 1] = tcolumn;
tcolumn++;
if (tcolumn == 5)
{
trow++;
tcolumn = 0;
}
}

switch(random.Next(6))
{
case 0:
int index_1 = random.Next(25);
int index_2 = random.Next(25);
int[] index_2_pos = new int[] { alphabet_pos[index_2, 0], alphabet_pos[index_2, 1] };
alphabet_pos[index_2, 0] = alphabet_pos[index_1, 0];
alphabet_pos[index_2, 1] = alphabet_pos[index_1, 1];
alphabet_pos[index_1, 0] = index_2_pos[0];
alphabet_pos[index_1, 1] = index_2_pos[1];
break;
case 1:
int row_index_1 = random.Next(5);
int row_index_2 = random.Next(5);
int[] row_of_index_2 = new int[5];
for (int i = 0; i < 25; i++)
{
if (alphabet_pos[i, 0] == row_index_2)
{
row_of_index_2[alphabet_pos[i, 1]] = i;
}

}
for(int i = 0; i < 25; i++)
{
if (alphabet_pos[i, 0] == row_index_1)
{
alphabet_pos[i, 0] = row_index_2;
}
}
foreach(int letter in row_of_index_2)
{
alphabet_pos[letter, 0] = row_index_1;
}
break;
case 2:
int column_index_1 = random.Next(5);
int column_index_2 = random.Next(5);
int[] column_of_index_2 = new int[5];
for (int i = 0; i < 25; i++)
{
if (alphabet_pos[i, 1] == column_index_2)
{
column_of_index_2[alphabet_pos[i, 0]] = i;
}

}
for(int i = 0; i < 25; i++)
{
if (alphabet_pos[i, 1] == column_index_1)
{
alphabet_pos[i, 1] = column_index_2;
}
}
foreach(int letter in column_of_index_2)
{
alphabet_pos[letter, 1] = column_index_1;
}
break;
case 3:
for(int i =0;i

Подробнее здесь: https://stackoverflow.com/questions/798 ... r-cipher-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»