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›.›