---------------Uwaga!------------------------------------------ Fragmenty w >...< -- pismo wytīuszczone Fragmenty w {...} -- kursywa --------------------------------------------------------- AMOS -- SZYFROWANIE Kiedyō bardzo mnie pociāgaīo wszystko, co byīo zwiāzane z szyfrowaniem. Pozwoliīem wiėc sobie napisaź artykuī poōwiėcony temu zagadnieniu. Nie bėdė tu przedstawiaī bardzo skomplikowanych algorytmów, wykorzystywanych np. przez Pentagon do przesyīania arcywaūnych wiadomoōci, lecz postaram siė pokazaź bardzo proste triki, mogāce posīuūyź nam -- amatorom, do naszych amatorskich zastosowaļ. Krzysztof Prusik Podstawowā jednostkā informacji w komputerze jest bajt, który moūe przyjmowaź wartoōci liczbowe od 0 do 255. Najmniejszā jednostkā informacji jest bit, który moūe byź równy 0 albo 1. Formacja oōmiu bitów, czyli oōmiocyfrowa liczba dwójkowa (np. %00010111=23) tworzy jeden bajt. Kaūdej literze zapisanej w pliku tekstowym (przechowujācym teksty ASCII) odpowiada numer z zakresu od 0 do 255, który jest tak zwanym kodem ASCII. Inaczej: kaūda litera przechowywana jest w jednym bajcie pamiėci. Bajty Najprostszym zakodowaniem informacji jest pomieszanie kolejnoōci bajtów w pliku. Przykīady: -- Odwrócenie kolejnoōci: Ala ma kota otrzymamy: atok am alA -- Zamiana pierwszego znaku z drugim, trzeciego z czwartym itd. Przykīad: Ala ma kota wynik: lA aamk toa -- Kaūde cztery bajty zapisaź odwrotnie. Przykīad: Ala ma kota powstanie zapis: alAk amota (ostatniej grupki bajtów nie ruszamy). -- Moūna takūe wymyōliź bardziej subtelne metody (np. pomieszanie z poplātaniem). -- Zastosowaź kodowanie kilkustopniowe (np. najpierw coō tam, a póśniej coō tam). Jednak wtedy trzeba pamiėtaź o tym, ūe odkodowujemy, zachowujāc odwrotnā kolejnoōź. Oto program realizujācy zadanie pierwsze (niezbyt efektywny, ale prosty): ' Bajty (C) 1994 By Arni Fusik ' '---------------------------- odczyt pliku NAZWA$=Fsel$("*.TXT","","Wybierz plik do zaszyfrowania") Open In 1,NAZWA$ Reserve As Work 99,Lof(1) Close 1 Print "Odczyt pliku: ";NAZWA$ Bload NAZWA$,Start(99) '---------------------------- (de)szyfrowanie Print "Proces (de)szyfrowania" For I=0 To Length(99)/2 INDEKS1=Start(99)+I INDEKS2=Start(99)+Length(99)-I-1 X=Peek(INDEKS1) Poke INDEKS1,Peek(INDEKS2) Poke INDEKS2,X Next '---------------------------- zapis pliku Print "Zapis pliku: ";NAZWA$ Bsave NAZWA$,Start(99) To Start(99)+Length(99) Print "Operacja zakoļczona" Przy pierwszym wywoīaniu programu kodujemy plik, przy nastėpnym -- rozkodowujemy. Bity Poprzedni program przestawiaī miejscami caīe bajty, a przecieū podobne operacje moūemy równieū wykonywaź na pojedynczych bitach. Znakowi "H", odpowiada kod ASCII numer 72, czyli binarnie %01001000. Na poszczególnych bitach liczby postaci dwójkowej moūemy przeprowadzaź te same operacje, co na caīych bajtach. Oto przykīad programu odwracajācego kolejnoōź cyfr liczby dwójkowej: ' Odwrócenie_bitów (C) 1994 By Arni Fusik ' Print Repeat Input " Wprowadś liczbė (0..255): ";LICZBA Until LICZBA>=0 and LICZBA<=255 Print Print " Wartosc binarna:= ";Bin$(LICZBA,8) For I=0 To 3 X=Btst(I,LICZBA) If Btst(7-I,LICZBA)=True Bset I,LICZBA Else Bclr I,LICZBA End If If X=True Bset 7-I,LICZBA Else Bclr 7-I,LICZBA End If Next Print " Po odwróceniu := ";Bin$(LICZBA,8) Print " Dziesiėtnie :=";LICZBA Uruchom powyūszy program. Juū? No to wpisz liczbė 72. Na ekranie powinny siė ukazaź komunikaty: Wprowadś liczbė (0..255): 72 Wartoōź binarna:= %01001000 Po odwróceniu := %00010010 Dziesiėtnie := 18 Oznaczajā one, ūe po zakodowaniu liczby 72 otrzymaliōmy 18. Jak to siė staīo? Jestem chyba winny kilka sīów wyjaōnienia. Otóū: >Btst(I,LICZBA)< -- funkcja sprawdza, czy bit numer {I} (poczynajāc od zera, liczāc od prawej do lewej) zmiennej {LICZBA} jest równy jeden (wtedy wynik = >True<, prawda) czy 0 (>False<, faīsz). >Bclr I,LICZBA< -- zeruje {I}-ty bit zmiennej {LICZBA}. >Bset I,LICZBA< -- ustawia {I}-ty bit na 1. >Bin$(LICZBA,8)< -- umoūliwia wydrukowanie zmiennej {LICZBA} w postaci oōmiu bitów. Czy teraz wszystko jasne? Jeūeli nie, to za pomocā kartki i oīówka, bez uūycia komputera przeanalizuj dziaīanie programu (zabaw siė w debugger). Negacja Prawdė mówiāc liczbė moūna zakodowaź o wiele proōciej, wykorzystujāc do tego celu inne specjalistyczne rozkazy AMOS-a, na przykīad negacjė: ' Negacja (C) 1994 By Arni Fusik ' Print Repeat Input " Wprowadś liczbė (0..255): ";LICZBA Until LICZBA>=0 and LICZBA<=255 Print Print " Wartoōź binarna:=";Bin$(LICZBA,8) Print " Po zanegowaniu :=";Bin$( Not(LICZBA),8) Print " Dziesiėtnie :=";Not(LICZBA) Gwoli wyjaōnienia: >Not(LICZBA)< -- funkcja neguje wszystkie bity zmiennej {LICZBA}, czyli zera zamienia na jedynki, a jedynki na zera. Do tej pory operowaliōmy liczbami zapisanymi w jednym bajcie pamiėci, czyli liczbami o dīugoōci oōmiu bitów. Podczas normalnej pracy AMOS wykorzystuje zmienne czterobajtowe (32 bity). Tak naprawdė wiėc >Not< zanegowaī wszystkie 32 bity zmiennej {LICZBA}. Jeūeli wiėc chcielibyōmy kodowaź teksty ASCII, musielibyōmy sprawdzaź, czy liczba po zakodowaniu nie jest mniejsza od 0 lub wiėksza niū 255, bo wtedy wystāpiīby bīād (z wiadomych przyczyn). Ale czy to by siė nam opīacaīo? AMOS udostėpnia innā ciekawā funkcjė, jakā jest >Bchg I,LICZBA<, (neguje ona bit numer {I} zmiennej {LICZBA}). Oto program, który koduje wprowadzony tekst, wykorzystujāc funkcjė >Bchg<: ' Bchg (C) 1994 By Arni Fusik ' Print Input " Wprowadś tekst: ";TEKST$ For I=1 To Len(TEKST$) LICZBA=Asc(Mid$(TEKST$,I,1)) Bchg 2,LICZBA Mid$(TEKST$,I,1)=Chr$(LICZBA) Next Print " po zakodowaniu: ";TEKST$ Krótki opis: >Asc(Mid$(TEKST$,I,1))< -- podaje kod ASCII znaku numer {I} zmiennej {TEKST$}. >Mid$(TEKST$,I,1)=Chr$(LICZBA)< -- przypisuje znakowi numer {I} zmiennej {TEKST} kod ASCII {LICZBA}. Gdybyōmy na przykīad uruchomili program i wprowadzili tekst: Ala ma psa to otrzymalibyōmy: Ehe$ie$twe Chyba kaūdy widzi, ūe algorytm kodujācy jest bardzo prosty, lecz efekt jego dziaīania zdumiewajācy. Innymi ciekawymi i zarazem prostymi rozkazami sā: >Rol.b N,LICZBA< -- powoduje rotacjė liczby o {N} bitów w lewo; >Ror.b N,LICZBA< -- jak wyūej, ale w prawo. Idziemy dalej... Napiszmy troszkė bardziej skomplikowany program, który w zaleūnoōci od opcji, jakā wybierze uūytkownik, bėdzie szyfrowaī lub rozszyfrowywaī dane. Proces kodowania bėdzie trzystopniowy: 1. Mieszanie kolejnoōci bajtów w pliku (pierwszy z drugim, trzeci z czwartym itd.). 2. Negacja drugiego i piātego bitu co trzeciego bajtu.---------------------?------------ 3. Rotacja wszystkich bajtów o jeden bit w lewo. Proste? No to piszemy: ************* TUTAJ LISTING Z DRUGIEGO PLIKU **************** Proponujė Ci, drogi Czytelniku, który dotarīeō do ostatniego akapitu artykuīu poōwiėconego AMOS-owi, abyō w domu dopracowaī powyūszy program. Oto moje propozycje zmian: 1. Dorobiź obsīugė bīėdów (np. odczyt pliku o dīugoōci zero). 2. Zlikwidowaź menu (program sam mógīby sprawdzaź, który plik jest zaszyfrowany i wymaga odszyfrowania, a który wprost przeciwnie). 3. Zwiėkszyź efektywnoōź, szybkoōź algorytmu (de)szyfrujācego. 4. Wprowadziź kodowanie na hasīo.