Newsgroup: it.comp.lang.pascal
Titolo: Collaboratori programma criptazione in pascal

. For more
information e-mail me');
writeln;write('Si sconsiglia di lavorare su files "pesanti" (maggiori di un
megabyte) con chiavi di criptazione troppo alte.');
writeln;writeln('Versione 0.5');
assign(pwd,'C:\windows\cryptsys.cry');reset(pwd); writeln;textcolor(testo);
if ioResult<>0 then begin
writeln;
writeln('Questa '#138' la prima volta che questo programma viene
eseguito');writeln;
write('Vuoi mettere una password all''avvio (S/N) ? ');readln(sce);
if (sce='S') or (sce='s') then begin
rewrite(pwd);append(pwd);write('Nuova password:
');readln(password);writeln(pwd,'Y',password);
end else begin writeln('Password iniziale non
impostata');rewrite(pwd);append(pwd);writeln(pwd,'null');end;end;
{$I+}
reset(pwd);readln(pwd,tt);close(pwd);
if tt<>'null' then begin writeln;
write('Inserisci la password: ');
getpassword('*');kk:=copy(tt,2,length(tt));
if kk=passvar then begin writeln;gotoxy(12,10);
caricamento('Loading ');textcolor(testo);writeln;write('Premi un tasto per
cominciare');readln;repeat
clrscr;
textcolor(testo);
writeln('1) Cripta');
writeln('2) Decripta');
writeln('3) Cripta con "parola d''ordine"');
writeln('4) Decripta con "parola d''ordine"');
writeln('5) Opzioni');
writeln('6) Esci');
writeln('Cosa vuoi fare? ');writeln;
choose:=upcase(readkey);
if choose='1' then begin writeln; textcolor(titolo);writeln('
*__* CRIPTA*__*');
textcolor(testo);writeln;cripta;end;
if choose='2' then begin writeln; textcolor(titolo);writeln('
*__* DECRIPTA*__*');
textcolor(testo);writeln;decripta;end;
if choose='5' then begin writeln; textcolor(titolo);writeln('
*__* OPZIONI *__*');
textcolor(testo);writeln;opzioni;end;
if choose='3' then begin writeln; textcolor(titolo);writeln('
*__* CRIPTA CON PASS *__*');
textcolor(testo);writeln;pas_cript;end;
if choose='4' then begin writeln; textcolor(titolo);writeln('
*__* DECRIPTA CON PASS *__*');
textcolor(testo);writeln;pas_decript;end;
until choose='6';gotoxy(12,10);
caricamento('Quitting ');textcolor(testo);writeln;write('Premi un tasto per
uscire');readln;
end;end;
if tt='null' then begin gotoxy(12,10);
caricamento('Loading ');textcolor(testo);writeln;write('Premi un tasto per
cominciare');readln;repeat
clrscr;
textcolor(testo);
writeln('1) Cripta');
writeln('2) Decripta');
writeln('3) Cripta con "parola d''ordine"');
writeln('4) Decripta con "parola d''ordine"');
writeln('5) Opzioni');
writeln('6) Esci');
writeln('Cosa vuoi fare? ');writeln;
choose:=upcase(readkey);
if choose='1' then begin writeln; textcolor(titolo);writeln('
*__* CRIPTA*__*');
textcolor(testo);writeln;cripta;end;
if choose='2' then begin writeln; textcolor(titolo);writeln('
*__* DECRIPTA*__*');
textcolor(testo);writeln;decripta;end;
if choose='3' then begin writeln; textcolor(titolo);writeln('
*__* CRIPTA CON PASS *__*');
textcolor(testo);writeln;pas_cript;end;
if choose='4' then begin writeln; textcolor(titolo);writeln('
*__* DECRIPTA CON PASS *__*');
textcolor(testo);writeln;pas_decript;end;
if choose='5' then begin writeln; textcolor(titolo);writeln('
*__* OPZIONI *__*');
textcolor(testo);writeln;opzioni;end;
until choose='6';gotoxy(12,10);
caricamento('Quitting ');textcolor(testo);writeln;write('Premi un tasto per
uscire');readln;
end else write('Password scorretta');end.
(****************************FINE PROGRAMMA******)
--
« Ma il tempo, il tempo chi me lo rende?
Chi mi da' indietro quelle stagioni
di vetro e sabbia, chi mi riprende
la rabbia e il gesto, donne e canzoni...»
                                      Francesco Guccini
«Considerate la vostra semenza:
fatti non foste a viver come bruti,
ma per seguir virtute e conoscenza»
                                       Dante
mailto: 
savecast...@virgilio.it

 return:=return+chr(ord(str[j])+n);
e se ti ritrovi un carattere "·" "?" che corrispondono ai codici 250 e 254
con una chiave di 50 sfondi i codici ascii !!
1) Velocità ? beh ! per quello che riguarda la velocità mi vengono in mente
tre cosette
1.1) Prima proviene dal passato : quando all'itis ho studiato il assembler
trasformavamo i cicli da 1 a 10 om cocòo da 9..0 questo perchè si
risparmiano paio di istruzioni macchina
1.2) Come dicono sempre all'uni maggiore spazio di memoria occupato per
contenere informazioni, minore tempo di
    esecuzione... o una cosa del genere... cmq
   ad ogni ciclo tu ti calcoli la lunghezza della stringa... basta farlo una
sola volta prima  !
   se non vuoi usare length che non sai come è implementata potresti fare un
ord(str[0]) che ti ritorna la lunghezza
   della stringa.
1.3) Accessi continui al disco !
       ogni volta che cripti una stringa la scrivi nel file ... uhm... usa
un buffer un array di stringhe
       che riempi con le stringhe criptate e quando è pieno lo riversi nel
file
        Fai lo stesso quando decripti
       Meno accessi fai al disco minore è il tempo che ci metti !
       Dirai ma io sempre le devo scrivere quelle stringhe... si ma in
questo modo non fai saltare la testina del disco
       da una parte all'altra per ogni singola riga...
2) Sicurezza
    sembra un po facile da "scoprire"  come criptazione non trovi  ?
    potresti fare una cosa differente..
                   2.1) Calcolare una funzione che genera numeri da 1 a 255
in base alla chiave di criptazione
                   2.2) Creare un bel set di array da 0..255 of char nel
quali inserisci i caratteri da sostituire
                           magari una bella matrice 50x255 che riempi in
maniera causale facendo attenzione che
                           in ogni riga non ci siano mai due caratteri
uguali. La matrice la generi una sola volta è la fai
                          diventare costante ! magari con un bel programmino
ad ok che la genera e te la scrive sul un file
                          proprio come la scriveresti tu nel tuo programma
pascal :)
        La 2.2 ti permette di guadagnare anche velocità di calcolo in
confronto alla 2.1 in quanto
                      avresti che return:=return + M[n,ord(str[j]))];
       il valore da inserire già è in memoria e ti basta richiamare una sola
funzione di conversione ord
       senza dimenticare che è possibile definire array del tipo a :
array['A'..'z']  al quale poi accedere direttamente
       così a['A']
       Potresti anche usare tutta la matrice per fare il criptaggio ad
esempio usando un array diverso ogni tot righe
       sai che bel casino  !
3) Affidabilità
     il computer non sbaglia mai l'uomo si nel mio caso solo sull hard disk
C ci sono 800 file *.txt secondo te quante possibilità ho di ricordami quale
chiave ho scelto per ogni file. Perchè non inserirla nel file criptato in
maniera casuale magari il codice di cripatazione lo inserisci random in una
delle prime 10 righe criptandolo con una
stringa casuale a cui applichi una maschera che fa vedere in chiaro solo i
numeri !
Forse mi sono perso un po...  cmq spero di esserti stato di aiuto
Ciao ReDiCuori
--
L'informatica è un arte
---------------------------------------------------------
 
www.pascallike.too.it
 
http://utenti.lycos.it/pascallike
 il sito sulla programmazione pascal
sorgenti, tutorial ed utility
---------------------------------------------------------


ad esempio ci vedo bene un case qui (credo che l'impl in ASM sia uguale alla
serie di if, pero' pero')
Ovviamente per rendere il codice piu' veloce possibile andrebbe usato ASM,
ma come tutti sappiamo e' un tipico linguaggio "da smaronamento"...
Comunque un paio di note per la sicurezza:
-secondo me tutte le operazioni in cui la password viene visualizzata in
chiaro dovrebbero avvenire sui registri della cpu, ma senza ASM e'
impossibile credo
-il sorgente sara' comunque disassemblabile, e con un po' di pazienza si
potra' risalire facilmente all'algoritmo
Comunque l'algoritmo per codificare il file dovrebbe essere molto piu'
complicato, pensandoci un momento mi e' venuta in mente quest'idea (molto
semplice)
Crei un vettore da 256 e la riempi con caratteri calcolati sulla password, e
inizi a riempire
che siano tutti diversi mi raccomando.
A questo punto si prende la stringa da codificare,
ogni carattere verra trafromato in 8 bit, quindi a seconda della posizione
nel carattere nella stringa i bit verranno modificati (ad esempio
bitcarattere XOR bitposizione) quindi il numero a 8bit che risultera' sara'
l'indice da usare nel vettore per la trasformazione.
Poi ovviamente per rendere la cosa piu' difficile si possono invertire i bit
di ogni carattere prima di scriverlo sull'HD e magari ricavando un numero
possono essere fatti altri lavori sui bit (tipo prendere 8 caratteri e
scambiare il loro n bit [con n calcolato sulla password])
Keita'
ps = passa a C, molto + bello
pps = soluzione alternativa? una chiave hardware da attaccare alla
parallela/seriale