Dobry wieczór,
na zadanie z kryptografii dostaliśmy tekst do odszyfrowania prostym szyfrem podstawieniowym monoalfabetycznym (małe litery bez cyfr i znaków interpunkcyjnych). Zadanie polega na przeprowadzeniu kryptoanalizy tekstu.
Napisałem sobie więc w C# poniższy algorytm: ( w komentarzach opiałem poszczególne sekcje )
public void DoJob()
{
List<LiteraSzczegoly> lista = new List<LiteraSzczegoly>();
//zliczanie poszczególnych liter w tekscie
foreach (char i in TextZaszyfrowany.Replace(" ", "").ToCharArray())
{
if (lista.Any(x => x.Litera == i))
{
lista.Where(x => x.Litera == i).First().Ilosc += 1;
}
else
{
lista.Add(new LiteraSzczegoly() { Ilosc = 1, Litera = i });
}
}
//sortowanie po ilości
var tmplist = lista.OrderByDescending(x => x.Ilosc).ToList();
//Alfabet polski w kolejnosci występowania liter
List<LiteraSzczegoly> literyWJP = new List<LiteraSzczegoly>();
literyWJP.Add(new LiteraSzczegoly() { Litera = 'a' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'i' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'o' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'e' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'z' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'n' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'r' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'w' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 's' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 't' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'c' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'y' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'k' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'd' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'p' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'm' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'u' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'j' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'l' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'b' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'g' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'h' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'f' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'q' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'v' });
literyWJP.Add(new LiteraSzczegoly() { Litera = 'x' });
//dopasowywanie poszczególnych liter (spacje pomijam)
foreach (char i in TextZaszyfrowany.ToCharArray())
{
if (i == ' ')
{
Odszyfrowany += " ";
}
else
{
var idZaszyfr = tmplist.FindIndex(a => a.Litera == i);
var odszyfr = literyWJP.ElementAt(idZaszyfr).Litera;
TextOdszyfrowany += odszyfr;
}
}
Log += "Odszyfrowano\n";
}
Niestety zwrócony wynik jest nie miarodajny w mojej opinii, przykład:
Zaszyfrowany:
ck dvorky lkykvxplxdu fgxjpkbgoeto mxao vytovolo yxaodvltq v pozlkrdto jgvqfovxyolxdu tlekgsodzt ...
"Odszyfrowany":
mo czawos nosozrynrcg ktrdyobtahea frpa zseazana srpacznei z yalnowcea dtzikazrsanrcg enhotuacle ...
prosiłbym o jakąś podpowiedź bądź sugestie co robię nie tak ;)
Pozdrawiam