IB001 – Úvod do programování – 4. domácí úkol – prolomení šifry

Zadání

Každý e-mailem obdržel zašifrovaný text, který se liší od textu obdrženého ostatními studenty – každý má jiný.
Vaším úkolem je navrhnout a implementovat program (v jazyku C), který šifru prolomí a odhalí tak čitelnou zprávu (prostý text).

Popis šifrovacího algoritmu

Nápověda

Neopisujte, nápadně podobná řešení budou diskvalifikována.

Odevzdání

Příklad prolomení šifry

Příklad zašifrování a dešifrování krok po kroku

Abeceda s poradim (desitky a na dalsim radku jednotky)
		 0         1         2         3         4         5         6         7
                 01234567890123456789012345678901234567890123456789012345678901234567890
char *abeceda = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_,.-:?!| ";

=================================================================================================
Zacatek kodovani textu: "Kolik programovacich jazyku znas..."
posun P nastavime na inicialni hodnotu 22 treba:

P = 22
'K' (pozice 36) + P (22) => pozice 58, 58 je mensi nez 71 => '7' ('7' jde na vystup)
	pozice '7' je 58, upravime P, P += 58 == 80 (22 + 58)
	jeste udelame modulo pres delku abecedy (max. index je 70, takze % 71)
		P %= 71, P == 9

zakodujeme dalsi znak 'o'
'o' (pozice 14) + P (9) => pozice 23, 23 je mensi nez 71 => 'x' ('x' jde na vystup)
	'x' ma pozici 23, P += 23, P == 32 (9 + 23)
	P %= 71, P == 32
	
zakodujeme dalsi znak 'l'
'l' (pozice 11) + P (32) => pozice 43, 43 je mensi nez 71, => 'R' ('R' jde na vystup)
	'R' ma pozici 33, P += 33, P == 65
	P %= 71, P == 65
atd.
 - ven tedy zatim slo "7xR" (coz odpovida prikladu vyse)

poznamka -- vyse nam vzdycky vychazelo po pricteni pozice kodovaneho znaku a P cisla < 71,
            pokud by se tak nestalo, staci zase pozici vzit % 71, napr.:
            
            kodujeme "K9" s inicialnim posunem 65:
            K (36) + P (65) => 101, 101 % 71 == 30, na pozici 30 je 'E'
	            P += 30, P == 65 + 30 == 95, P %= 71, P = 24
            9 (60) + P (24) => 84, 84 % 71 == 13, na pozici 13 je 'n'
            => Takze se to zakoduje do "En"
=================================================================================================
Priklad kousku zakodovaneho textu: "7xR"
	- musite zkouset vsechny mozne inicialni posuny, dalsi lze dopocitat
	- "trefime", ze inicialni posun je P = 22
	
P = 22
'7' (pozice 58), 58 - P (22) == 36, 36 >= 0 => na pozici 36 je 'K' ('K' jde na vystup)
	P += 58 (pozor, musime pricist pozici zasifrovaneho znaku pred jeho desifrovanim)
	P == 22 + 58 == 80
	P %= 71, P == 9

	
'x' (pozice 23), 23 - P (9) == 14, 14 >= 0 => na pozici 14 je 'o' ('o' jde na vystup)
	P += 23, P == (23 + 9)  % 71 == 32
	
'R' (pozice 43), 43 - P (32) == 11, 11 >= 0 => na pozici 11 je 'l' ('l' jde na vystup)
atd.
 - ven tedy slo "Kol", coz odpovida prefixu sifrovaneho textu
 
poznamka -- pokud se stane, ze po odecteni od pozice zasifrovaneho znaku posun P vyjde < 0,
	    pak treba pricist delku abecedy (abychom jakoby sly od jejiho konce), napr.:
	    
	    dekodujeme "En" z vyse uvedeneho s inicialnim posunem P == 65:
	    E (30) - P(65) => 30 - 65 == -35, to je < 0, proto vezmeme pozici -35 + 71 == 36, na pozici 36 je 'K'
		P += 30, P == 65 + 30 == 95, P %= 71, P == 95 % 71 == 24, P == 24
	    n (13) - P(24) => 13 - 24 < 0 => 13 - 24 + 71 = 60, na pozici 60 je '9'
	    => takze jsme dekodovali "K9", coz je to, co jsme zakodovali
	    
	    (alternativne by asi slo vzdycky pricist 71 a vzdycky udelat % 71, protoze z prikladu dekodovani "7xR":
	    	23 - 9 == 14
	    	(23 - 9 + 71) % 71 = 14
	     - ale nezkousel jsem to implementovat, jen me to tak tedka napadlo
	    )
=================================================================================================