programowanie asembler algorytmy

szyfrowanie

Szyfrowanie przez XOR'owanie

Jest to najprostszy sposób szyfrowania. Polega on tylko na xor'owaniu danych jakimś kluczem. Deszyfrowanie polega na ponownym xor'owaniu danych. Na czym polega xor'owanie? Jest to operacja logiczna jak np: 'and' czy 'or'. Oto 'tablica prawdy':

a b | wynik
----+----
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0

Jak widać, gdy bity są takie same to mamy 0, a jak są różne to mamy jeden. Z tego wynika, że a xor b xor b = a.

Siła szyfrowania zależy od długości klucza. Dla klucza jednobajtowego złamanie kodu jest bardzo proste. Nawet dla kluczy o długości kilkudziesięciu bajtów złamnie kodu może nie być trudne jeżeli znamy typ zakodowanych danych. Dla maksymalnego bezpieczeństwa należy stosować klucze o długości danych lub nawet dłuższe (wtedy są obcinane). Wtedy zdekodowanie danych bez klucza jest niemożliwe.

Szyfrowanie przez xor'owanie jest jedną z najszybszych metod szyfrowania. Napisane w asemblerze ma przepustowość prawie równą przepustowości pamięci (najszybciej z wykorzystaniem instrukcji MMX).

Jednak standardowe szyfrowanie z krótkim kluczem (wielokrotnie krótszym od szyfrowanych danych) nie zapewnia należytego bezpieczeństwa. W takim przypadku klucz powiela się, aby był tak samo długi jak dane. Dlatego jest łatwy do złamania. Szyfrowanie można ulepszyć przez zastosowanie zmiennego klucza. Zamiast powielać cały czas taki sam klucz, można go za każdym razem w pewien stały sposób modyfikować np: mnożyć, dodawać, dzielić itp. Algorytm modyfikujący musi być stały, tzn. aby z danego fragmentu klucza powstawał zawsze taki sam pełny klucz. Modyfikacje mogą być różne. Najlepiej, aby do modyfikacji użyć jakichś kolejnych kluczy. Im więcej użytych kluczy, im są one dłuższe i im więcej modyfikacji klucza, tym bardziej szyfrowanie jest trudniejsze do złamania.

Przykładowy algorytm (de)szyfrujący ze stałym kluczem:

        mov     ecx,[długość_danych]
        mov     edi,dane
@@:
        xor     [edi],klucz
        inc     edi
        loop    @b

Powyższy algorytm to najłatwiejszy sposób, bardzo łatwy do zdeszyfrowania. Można go ulepszyć stosując liczby pseudolosowe:

        mov     [rand_seed],klucz
        mov     edi,dane
        mov     ecx,[długość_danych]
@@:
        mov     al,-1
        call    random
        xor     [edi],al
        inc     edi
        loop    @b

Ten algorytm daje już bardzo dobre zabezpieczenie pod warunkiem, że sekwencje liczb generowane przez procedurę random są stosunkowo długie (tak, tak, random zawsze generuje powtarzające się sekwencje, ich długośc zależy od algorytmu modyfikacji 'swojego' klucza, w tym przypadku zmiennej rand_seed).

Na tym pozwolę sobie zakończyć. Może niedługo napiszę jakiś program do szyfrowania danych, a tymczasem Wy możecie napisać swój własny szyfrator. Powodzenia ;-)