From: "Filip Drsek" 
To: "All about Atari beast an' even more..." 
Subject: Sifrovani souboru
Date: Wed, 17 Dec 1997 15:19:32 MET-DST

Pokusim se zde popsat metodu sifrovani souboru na Atari 800/130.

Soubor je mozne sifrovat nejjednoduseji tak, ze kazdy jeho byte zvysime o totez cislo a takto vznikle cislo pripadne jeste upravime odectenim 256, aby se veslo do potrebneho rozsahu. Pri desifrovani od kazdeho bytu odecitame tutez konstantu a opet upravujeme na potrebny rozsah (+256 u zapornych cisel).

Takto sifrovany soubor se vsak da pomerne snadno rozlustit. Staci vyzkouset postupne konstanty 1 az nejvyse 255, treba jen na cast souboru. Pokud jde o spustitelny binarni soubor, staci najit takovou konstantu, aby prvni dva byty byly desifrovany jako 255 a 255, coz je poznavaci znameni tohoto typu souboru. U textoveho souboru by se poznalo nalezeni spravne konstanty podle velkeho vyskytu pismen a mezer a aspon castecne srozumitelnosti slov.

U nekterych pocitacu se da ovladat generator nahodnych cisel (napriklad prikazem Randomize) tak, ze pro stejny zaklad dostaneme vzdycky stejnou posloupnost cisel. Kazde nasledujici nahodne cislo je vypocitano z predchoziho, neodecita se z zadneho casovace jako u Atari. Na takovem pocitaci pak muzeme napsat sifrovaci program, ktery k jednotlivym bytum souboru nepricita konstantu, ale ruzna cisla z generatoru nahodnych cisel, spusteneho od urciteho zakladu. Navic zakladu muze byt mnohem vic nez konstant, takze takto sifrovany soubor uz se neda jen tak snadno rozlustit.

Ve svem postupu jsem jako generator nahodnych cisel pouzil jednoduchy multiplikativni algoritmus. Nasledujici cislo se z predchoziho vypocita jeho vynasobenim nejakou konstantou (nejvhodnejsi je cislo 83) a naslednym odstranenim celociselne casti tohoto soucinu. Vychozi hodnotu pro generator nahodnych cisel program vypocita z hesla, ktere muze byt 2 az 10 znaku dlouhe a muze obsahovat libovolne znaky krome Backspace, Return a CHR$(0), podle vzorce R0=SQR(C/(128*D*(D+1))), kde C je soucet soucinu ASCII-kodu jednotlivych znaku a jejich poradovych cisel a D je pocet znaku hesla. Vyraz za lomitkem je navrzen tak, aby byl vzdycky vetsi nez C, a odmocnina zvysuje pocet desetinnych mist v cisle.

Program muze vypadat napriklad takto:

 1 REM Sifrator
 2 H$(10),KH$(10),ZDROJ$(15),CIL$(15),SD$(1)
 3 PRINT "Zadejte heslo : ";:GOSUB 20
 4 H$=KH$
 5 PRINT "Kontrola hesla: ";:GOSUB 20
 6 IF H$<>KH$ THEN PRINT "Chyba pri zadavani hesla!":GOTO 3
 7 C=0:D=LEN(H$):FOR A=1 TO D:C=C+A*ASC(H$(A,A)):NEXT A:
   R0=SQR(C/(128*D*(D+1))):R=R0
 8 PRINT "(S)ifrovat, nebo (D)esifrovat";:INPUT SD$
 9 IF SD$<>"S" AND SD$<>"D" THEN PRINT "S nebo D, prosim.":GOTO 8
10 PRINT "Zdrojovy soubor";:INPUT ZDROJ$
11 PRINT "Cilovy soubor  ";:INPUT CIL$
12 IF ZDROJ$=CIL$ THEN PRINT "Soubory musi byt ruzne!":GOTO 10
13 OPEN #1,4,0,ZDROJ$:OPEN #2,8,0,CIL$:TRAP 15
14 GET #1,A:A=A+((SD$="S")-(SD$="D"))*INT(256*R):A=A+256*(A<0)-256* 
   (A>255):PUT #2,A:R=83*R-INT(83*R):GOTO 14
15 CLOSE #1:CLOSE #2
16 IF PEEK(195)=136 THEN PRINT "Hotovo!":END
17 PRINT "Doslo k chybe ";PEEK(195):END
20 REM Heslo
21 KH$="":N=0:OPEN #3,4,0,"K:"
22 GET #3,A:IF A=0 THEN 22
23 IF A=126 OR A=155 THEN 25
24 IF N<10 THEN PRINT "*";:N=N+1:KH$(LEN(KH$)+1)=CHR$(A):GOTO 22
25 IF A=126 AND N>1 THEN PRINT CHR$(A);:N=N-1:KH$=KH$(1,N):GOTO 22
26 IF A=126 AND N=1 THEN PRINT CHR$(A);:N=0:KH$="":GOTO 22
27 IF A=155 AND N>1 THEN 29
28 GOTO 22
29 CLOSE #3:RETURN