Prosty szyfr podstawieniowy monoalfabetyczny.

0

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

1

Widzę, że liczysz tylko pojedyncze znaki, może warto również sprawdzić częstotliwość występowania dwuznaków, co powinno Ci przy dużym tekście zdecydowanie poprawić wyniki. To samo możesz zrobić dla pierwszych i ostatnich znaków w słowach.

1

No i, na litość boską, użyj pętli zamiast kopiuj wklej, bo nie wiem czy komuś będzie się to chciało czytać.

0

Ja jeszcze dodam, że analiza statystyczna nie stanowi jeszcze rozwiązania. Jest to jedynie wskazówka, gdzie należy szukać rozwiązania.
Im szyfrogram będzie dłuższy tym zapewne wynik analizy statystycznej będzie pewniejszy, ale nigdy nie będzie to 100% pewności.
Ostateczną weryfikację trzeba zrobić korzystając np ze słownika.

Poza tym, czy ty w ogóle zrobiłeś histogram z szyfrogramu? Zrobiłeś histogram z jakiegoś normalnego tekstu, by mieć porównanie?

0 użytkowników online, w tym zalogowanych: 0, gości: 0