Prosty szyfr podstawieniowy monoalfabetyczny.

Odpowiedz Nowy wątek
2018-11-07 18:33
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

Kolejne zadanie domowe, nawet się nie z tym nie Kryjesz:P - lion137 2018-11-07 19:25
A powinienem? nie proszę o gotowca tylko o małą sugestie na co powinienem zwrócić uwagę. Widać że to jest zadanie nawet bez tego bo kto normalny szufruje w tych czasach w ten sposób i ramach czegoś innego niż nauka ;) - gregg95 2018-11-07 19:29

Pozostało 580 znaków

2018-11-07 23:12
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.

Pozostało 580 znaków

2018-11-08 18:43
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ć.

Pętla tutaj tak naprawdę dużo by nie zmieniła. - hauleth 2018-11-09 12:44

Pozostało 580 znaków

2018-11-14 15:46
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?


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2018-11-14 15:50

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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