home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 01 / ami046.txt < prev    next >
Text File  |  1997-04-06  |  7KB  |  346 lines

  1.  
  2.  
  3. ---------------Uwaga!------------------------------------------
  4.  
  5. Fragmenty w >...< -- pismo wytîuszczone
  6.  
  7. Fragmenty w {...} -- kursywa
  8.  
  9. ---------------------------------------------------------
  10.  
  11.  
  12. AMOS -- SZYFROWANIE
  13.  
  14. <lead> Kiedyô bardzo mnie pociâgaîo wszystko, co byîo zwiâzane z
  15. szyfrowaniem. Pozwoliîem wiëc sobie napisaê artykuî poôwiëcony
  16. temu zagadnieniu. Nie bëdë tu przedstawiaî bardzo skomplikowanych
  17. algorytmów, wykorzystywanych np. przez Pentagon do przesyîania
  18. arcywaûnych wiadomoôci, lecz postaram sië pokazaê bardzo proste
  19. triki, mogâce posîuûyê nam -- amatorom, do naszych amatorskich
  20. zastosowaï.
  21.  
  22. <a> Krzysztof Prusik
  23.  
  24. <txt> Podstawowâ jednostkâ informacji w komputerze jest bajt,
  25. który moûe przyjmowaê wartoôci liczbowe od 0 do 255. Najmniejszâ
  26. jednostkâ informacji jest bit, który moûe byê równy 0 albo 1.
  27. Formacja oômiu bitów, czyli oômiocyfrowa liczba dwójkowa (np.
  28. %00010111=23) tworzy jeden bajt. Kaûdej literze zapisanej w pliku
  29. tekstowym (przechowujâcym teksty ASCII) odpowiada numer z zakresu
  30. od 0 do 255, który jest tak zwanym kodem ASCII. Inaczej: kaûda
  31. litera przechowywana jest w jednym bajcie pamiëci.
  32.  
  33. <sr>Bajty
  34.  
  35. <txt> Najprostszym zakodowaniem informacji jest pomieszanie
  36. kolejnoôci bajtów w pliku. Przykîady:
  37.  
  38. -- Odwrócenie kolejnoôci:
  39.  
  40. <l>Ala ma kota
  41.  
  42. <txt>otrzymamy:
  43.  
  44. <l>atok am alA
  45.  
  46.  
  47. <txt>-- Zamiana pierwszego znaku z drugim, trzeciego z czwartym
  48. itd. Przykîad:
  49.  
  50. <l>Ala ma kota
  51.  
  52. <txt>wynik:
  53.  
  54. <l>lA aamk toa
  55.  
  56.  
  57. <txt>-- Kaûde cztery bajty zapisaê odwrotnie. Przykîad:
  58.  
  59. <l>Ala ma kota
  60.  
  61. <txt>powstanie zapis:
  62.  
  63. <l> alAk amota
  64.  
  65. <txt>(ostatniej grupki bajtów nie ruszamy).
  66.  
  67.  
  68. -- Moûna takûe wymyôliê bardziej subtelne metody (np. pomieszanie
  69. z poplâtaniem).
  70.  
  71.  
  72. -- Zastosowaê kodowanie kilkustopniowe (np. najpierw coô tam, a
  73. póúniej coô tam). Jednak wtedy trzeba pamiëtaê o tym, ûe
  74. odkodowujemy, zachowujâc odwrotnâ kolejnoôê.
  75.  
  76.  
  77. Oto program realizujâcy zadanie pierwsze (niezbyt efektywny, ale
  78. prosty):
  79.  
  80. <l>' Bajty (C) 1994 By Arni Fusik
  81.  
  82. '
  83.  
  84. '---------------------------- odczyt pliku
  85.  
  86. NAZWA$=Fsel$("*.TXT","","Wybierz plik do zaszyfrowania")
  87.  
  88. Open In 1,NAZWA$
  89.  
  90. Reserve As Work 99,Lof(1)
  91.  
  92. Close 1
  93.  
  94. Print "Odczyt pliku: ";NAZWA$
  95.  
  96. Bload NAZWA$,Start(99)
  97.  
  98. '---------------------------- (de)szyfrowanie
  99.  
  100. Print "Proces (de)szyfrowania"
  101.  
  102. For I=0 To Length(99)/2
  103.  
  104.    INDEKS1=Start(99)+I
  105.  
  106.    INDEKS2=Start(99)+Length(99)-I-1
  107.  
  108.    X=Peek(INDEKS1)
  109.  
  110.    Poke INDEKS1,Peek(INDEKS2)
  111.  
  112.    Poke INDEKS2,X
  113.  
  114. Next
  115.  
  116. '---------------------------- zapis pliku
  117.  
  118. Print "Zapis pliku: ";NAZWA$
  119.  
  120. Bsave NAZWA$,Start(99) To Start(99)+Length(99)
  121.  
  122. Print "Operacja zakoïczona"
  123.  
  124.  
  125. <txt>Przy pierwszym wywoîaniu programu kodujemy plik, przy
  126. nastëpnym -- rozkodowujemy.
  127.  
  128.  
  129. <sr>Bity
  130.  
  131. <txt> Poprzedni program przestawiaî miejscami caîe bajty, a
  132. przecieû podobne operacje moûemy równieû wykonywaê na
  133. pojedynczych bitach.
  134.  
  135. Znakowi "H", odpowiada kod ASCII numer 72, czyli binarnie
  136. %01001000. Na poszczególnych bitach liczby postaci dwójkowej
  137. moûemy przeprowadzaê te same operacje, co na caîych bajtach. Oto
  138. przykîad programu odwracajâcego kolejnoôê cyfr liczby dwójkowej:
  139.  
  140. <l>' Odwrócenie_bitów (C) 1994 By Arni Fusik
  141.  
  142. '
  143.  
  144. Print
  145.  
  146. Repeat
  147.  
  148.    Input " Wprowadú liczbë (0..255): ";LICZBA
  149.  
  150. Until LICZBA>=0 and LICZBA<=255
  151.  
  152. Print
  153.  
  154. Print " Wartosc binarna:= ";Bin$(LICZBA,8)
  155.  
  156. For I=0 To 3
  157.  
  158.    X=Btst(I,LICZBA)
  159.  
  160.    If Btst(7-I,LICZBA)=True
  161.  
  162.       Bset I,LICZBA
  163.  
  164.    Else
  165.  
  166.       Bclr I,LICZBA
  167.  
  168.    End If
  169.  
  170.    If X=True
  171.  
  172.       Bset 7-I,LICZBA
  173.  
  174.    Else
  175.  
  176.       Bclr 7-I,LICZBA
  177.  
  178.    End If
  179.  
  180. Next
  181.  
  182. Print " Po odwróceniu  := ";Bin$(LICZBA,8)
  183.  
  184. Print " Dziesiëtnie    :=";LICZBA
  185.  
  186.  
  187. <txt>Uruchom powyûszy program. Juû? No to wpisz liczbë 72. Na
  188. ekranie powinny sië ukazaê komunikaty:
  189.  
  190. <l>Wprowadú liczbë (0..255): 72
  191.  
  192.  
  193. Wartoôê binarna:= %01001000
  194.  
  195. Po odwróceniu  := %00010010
  196.  
  197. Dziesiëtnie    := 18
  198.  
  199.  
  200. <txt>Oznaczajâ one, ûe po zakodowaniu liczby 72 otrzymaliômy 18.
  201. Jak to sië staîo? Jestem chyba winny kilka sîów wyjaônienia.
  202. Otóû:
  203.  
  204. >Btst(I,LICZBA)< -- funkcja sprawdza, czy bit numer {I} (poczynajâc
  205. od zera, liczâc od prawej do lewej) zmiennej {LICZBA} jest równy
  206. jeden (wtedy wynik = >True<, prawda) czy 0 (>False<, faîsz).
  207.  
  208. >Bclr I,LICZBA< -- zeruje {I}-ty bit zmiennej {LICZBA}.
  209.  
  210. >Bset I,LICZBA< -- ustawia {I}-ty bit na 1.
  211.  
  212. >Bin$(LICZBA,8)< -- umoûliwia wydrukowanie zmiennej {LICZBA} w
  213. postaci oômiu bitów.
  214.  
  215. Czy teraz wszystko jasne? Jeûeli nie, to za pomocâ kartki i
  216. oîówka, bez uûycia komputera przeanalizuj dziaîanie programu
  217. (zabaw sië w debugger).
  218.  
  219.  
  220. <sr>Negacja
  221.  
  222. <txt> Prawdë mówiâc liczbë moûna zakodowaê o wiele proôciej,
  223. wykorzystujâc do tego celu inne specjalistyczne rozkazy AMOS-a,
  224. na przykîad negacjë:
  225.  
  226. <l>' Negacja (C) 1994 By Arni Fusik
  227.  
  228. '
  229.  
  230. Print
  231.  
  232. Repeat
  233.  
  234.    Input " Wprowadú liczbë (0..255): ";LICZBA
  235.  
  236. Until LICZBA>=0 and LICZBA<=255
  237.  
  238. Print
  239.  
  240. Print " Wartoôê binarna:=";Bin$(LICZBA,8)
  241.  
  242. Print " Po zanegowaniu :=";Bin$( Not(LICZBA),8)
  243.  
  244. Print " Dziesiëtnie    :=";Not(LICZBA)
  245.  
  246.  
  247. <txt>Gwoli wyjaônienia:
  248.  
  249. >Not(LICZBA)< -- funkcja neguje wszystkie bity zmiennej {LICZBA},
  250. czyli zera zamienia na jedynki, a jedynki na zera.
  251.  
  252. Do tej pory operowaliômy liczbami zapisanymi w jednym bajcie
  253. pamiëci, czyli liczbami o dîugoôci oômiu bitów. Podczas
  254. normalnej pracy AMOS wykorzystuje zmienne czterobajtowe (32
  255. bity). Tak naprawdë wiëc >Not< zanegowaî wszystkie 32 bity
  256. zmiennej {LICZBA}. Jeûeli wiëc chcielibyômy kodowaê teksty ASCII,
  257. musielibyômy sprawdzaê, czy liczba po zakodowaniu nie jest
  258. mniejsza od 0 lub wiëksza niû 255, bo wtedy wystâpiîby bîâd (z
  259. wiadomych przyczyn). Ale czy to by sië nam opîacaîo?
  260.  
  261. AMOS udostëpnia innâ ciekawâ funkcjë, jakâ jest >Bchg I,LICZBA<,
  262. (neguje ona bit numer {I} zmiennej {LICZBA}). Oto program, który
  263. koduje wprowadzony tekst, wykorzystujâc funkcjë >Bchg<:
  264.  
  265. <l>' Bchg (C) 1994 By Arni Fusik
  266.  
  267. '
  268.  
  269. Print
  270.  
  271. Input " Wprowadú tekst: ";TEKST$
  272.  
  273. For I=1 To Len(TEKST$)
  274.  
  275.    LICZBA=Asc(Mid$(TEKST$,I,1))
  276.  
  277.    Bchg 2,LICZBA
  278.  
  279.    Mid$(TEKST$,I,1)=Chr$(LICZBA)
  280.  
  281. Next
  282.  
  283. Print " po zakodowaniu: ";TEKST$
  284.  
  285.  
  286. <txt>Krótki opis:
  287.  
  288. >Asc(Mid$(TEKST$,I,1))< -- podaje kod ASCII znaku numer {I}
  289. zmiennej {TEKST$}.
  290.  
  291. >Mid$(TEKST$,I,1)=Chr$(LICZBA)< -- przypisuje znakowi numer {I}
  292. zmiennej {TEKST} kod ASCII {LICZBA}.
  293.  
  294. Gdybyômy na przykîad uruchomili program i wprowadzili tekst:
  295.  
  296. <l>Ala ma psa
  297.  
  298. <txt>to otrzymalibyômy:
  299.  
  300. <l>Ehe$ie$twe
  301.  
  302. <txt>Chyba kaûdy widzi, ûe algorytm kodujâcy jest bardzo prosty,
  303. lecz efekt jego dziaîania zdumiewajâcy.
  304.  
  305. Innymi ciekawymi i zarazem prostymi rozkazami sâ:
  306.  
  307. >Rol.b N,LICZBA< -- powoduje rotacjë liczby o {N} bitów w lewo;
  308.  
  309. >Ror.b N,LICZBA< -- jak wyûej, ale w prawo.
  310.  
  311.  
  312. <sr>Idziemy dalej...
  313.  
  314. <txt> Napiszmy troszkë bardziej skomplikowany program, który w
  315. zaleûnoôci od opcji, jakâ wybierze uûytkownik, bëdzie szyfrowaî
  316. lub rozszyfrowywaî dane. Proces kodowania bëdzie trzystopniowy:
  317.  
  318. 1.  Mieszanie kolejnoôci bajtów w pliku (pierwszy z drugim,
  319. trzeci z czwartym itd.).
  320.  
  321. 2. Negacja drugiego i piâtego bitu co trzeciego bajtu.---------------------?------------
  322.  
  323. 3. Rotacja wszystkich bajtów o jeden bit w lewo.
  324.  
  325. Proste? No to piszemy:
  326.  
  327.  
  328.  
  329. ************* TUTAJ LISTING Z DRUGIEGO PLIKU ****************
  330.  
  331.  
  332.  
  333. Proponujë Ci, drogi Czytelniku, który dotarîeô do ostatniego
  334. akapitu artykuîu poôwiëconego AMOS-owi, abyô w domu dopracowaî
  335. powyûszy program. Oto moje propozycje zmian:
  336.  
  337. 1.  Dorobiê obsîugë bîëdów (np. odczyt pliku o dîugoôci zero).
  338.  
  339. 2.  Zlikwidowaê menu (program sam mógîby sprawdzaê, który plik
  340. jest zaszyfrowany i wymaga odszyfrowania, a który wprost
  341. przeciwnie).
  342.  
  343. 3.  Zwiëkszyê efektywnoôê, szybkoôê algorytmu (de)szyfrujâcego.
  344.  
  345. 4.  Wprowadziê kodowanie na hasîo.
  346.