Łamacz szyfru Cezara

0

Witam,
Potrzebuje pomocy w napisaniu programu który będzie łamał tekst zmieniony szyfrem Cezara z nieznanym przesunięciem (nie koniecznie o 3). Program ma przerabiać tekst na 26 wersji (tyle jest kombinacji ze względu na ilość liter - tekst z angielskiego) i z nich wybrać najlepszy wynik korzystając z trzech metod:

  1. Sprawdzanie występowania liter w tekście i porównywanie z najczęściej występującymi w angielskim(e - 9,57; t - 6,68; a - 6,22). Możemy zsumować występowanie liter e,t,a i wersja w której będzie ich najwięcej jest najbardziej prawdopodobna.
  2. Występowanie trigramów - analogicznie do występowania liter. W angielskim najczęściej występują: THE, ING, AND, HER, ERE, ENT, THA, NTH, WAS, ETH, FOR, DTH.
  3. Występowanie słów. Najczęściej występujące:
    THE 6,421 %
    OF 4,028 %
    AND 3,150 %
    TO 2,367 %
    A 2,092 %
    IN 1,778 %
    THAT 1,244 %
    IS 1,034 %
    I 0,945 %
    IT 0,930 %
    FOR 0,770 %
    AS 0,764 %
    Na końcu wyświetlenie tych trzech wyników według metod.

Z góry wielkie dzięki za pomoc!
Pozdrawiam!
Radek

0

przecież masz cały algorytm napisany w treści zadania, więc w czym problem?

0

Słaby jestem w c++, wiem jak powinien wyglądać program, ale nie do końca wiem jak go napisać... :( Mogę prosić o pomoc...? :)
Pozdrawiam!

0

Najprościej (a więc chyba i najlepiej) będzie policzyć jaka jest różnica odległości między literami w frazach 2, 3 i tych co ty podałeś, i porównując je z tymi z pliku łatwo znajdziesz klucz. Swoją drogą o łamaniu szyfru cezara już tu kiedyś było, skorzystaj z szukajki

4

Może zabrzmię banalnie, ale jakbym miał złamać jedną wiadomość w szyfrze Cezara, to bym po prostu wyświetlił 26 zdekodowanych wersji na raz, przeleciał wzrokiem i wybrał jedną ;-)

0

Wiesz pewnie, ze zakres przesuniec jest ograniczony. Zrob sobie strukturke zawierajaca informacje o wystepowaniu tych zwrotow THE, AND itp. i zapisuj do strukturki wyniki dla kazdego przesuniecia.

Ja bym taka strukturke wymyslil mniejwiecej

char tekst[] = "csadfrsgfrg ewtrhcreghw hwtreh hwrt";
struct wystepowanie
{
     float THE;
     float AND;
     float TO;
     int przesuniecie;
};
struct wystepowanie s_wyst[53];
 
for(int N_przesuniecie = -26; N_przesuneicie<26; N_przesuniecie++) //przesuniecie wynosi na poczatku -26, zeby sprawdzic kombinacje takze w tyl (Kod ASCII ci sie nie skonczy ;P)
{
     char tekst_z_przesuneiciem[strlen(&tekst[0])];
     for(int n=0; n<strlen(&tekst[0]); n++)
     {
          tekst_z_przesuneiciem[n] = tekst[n] + N_przesuneicie;
     }  
     s_wyst[N_przesuneicie+26].przesuneicie = N_przesuneicie;
     //tu sprawdz sobie wystepowanie w przesuneitym tekscie liter
     //potek petla wykona sie ponownie dla kolejnego przesuneicia.
     
} 
//Tutaj porownaj sobie struktury i wybierz najodpowiedniejsza
0

Dla angielskiego to proste, znaleźć 2 3 literowe słowa, wyznaczyć różnice między kolejnymi literami i w ten sposób rozpoznać słowo (możliwości o dużym prawdopodobieństwie jest niewiele). Przelecenie kilku takich słów powinno spokojnie pozwolić na jednoznaczne wyznawczynie przesunięcia.

0
RadekS666 napisał(a)

Słaby jestem w c++, wiem jak powinien wyglądać program, ale nie do końca wiem jak go napisać... :( Mogę prosić o pomoc...? :)
Pozdrawiam!

A nie możesz zrobić tego w języku który lubisz? ;)

0
vpiotr napisał(a)

A nie możesz zrobić tego w języku który lubisz? ;)

W tym problem że nie mogę... :( Czy mógł by ktoś stracić trochę czasu i napisać pełny kod...? ;)
Z góry WIELKIE DZIĘKI!!! :)

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