home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
01
/
ami046.txt
< prev
next >
Wrap
Text File
|
1997-04-06
|
7KB
|
346 lines
---------------Uwaga!------------------------------------------
Fragmenty w >...< -- pismo wytîuszczone
Fragmenty w {...} -- kursywa
---------------------------------------------------------
AMOS -- SZYFROWANIE
<lead> 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ï.
<a> Krzysztof Prusik
<txt> 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.
<sr>Bajty
<txt> Najprostszym zakodowaniem informacji jest pomieszanie
kolejnoôci bajtów w pliku. Przykîady:
-- Odwrócenie kolejnoôci:
<l>Ala ma kota
<txt>otrzymamy:
<l>atok am alA
<txt>-- Zamiana pierwszego znaku z drugim, trzeciego z czwartym
itd. Przykîad:
<l>Ala ma kota
<txt>wynik:
<l>lA aamk toa
<txt>-- Kaûde cztery bajty zapisaê odwrotnie. Przykîad:
<l>Ala ma kota
<txt>powstanie zapis:
<l> alAk amota
<txt>(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):
<l>' 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"
<txt>Przy pierwszym wywoîaniu programu kodujemy plik, przy
nastëpnym -- rozkodowujemy.
<sr>Bity
<txt> 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:
<l>' 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
<txt>Uruchom powyûszy program. Juû? No to wpisz liczbë 72. Na
ekranie powinny sië ukazaê komunikaty:
<l>Wprowadú liczbë (0..255): 72
Wartoôê binarna:= %01001000
Po odwróceniu := %00010010
Dziesiëtnie := 18
<txt>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).
<sr>Negacja
<txt> 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ë:
<l>' 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)
<txt>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<:
<l>' 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$
<txt>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:
<l>Ala ma psa
<txt>to otrzymalibyômy:
<l>Ehe$ie$twe
<txt>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.
<sr>Idziemy dalej...
<txt> 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.