PDA

Visualizza la versione completa : [PASCAL] Programma per criptare e decriptare testi


lomiz
24-11-2005, 19:04
Ciao a tutti.
Vorrei creare un programma che cripti e decripti un testo con pi possibili algoritmi ma non riesco a capire come iniziare.
Mi potete fare un esempio di una procedura che cripti una stringa ed un'altra che la decripti?
Grazie. :)

mico
24-11-2005, 19:42
Non sono molto esperto di crittografia per se vuoi informazioni sui vari cifrati prova qui (http://www.liceofoscarini.it/studenti/crittografia/)!
mentre per programmarne qualcuno in pascal io ho provato ad usare i file di testo e la codifica ascii almeno per gli algoritmi pi semplici! uscito qualcosa di decente anche se non so se il metodo migliore!

king64
26-11-2005, 11:58
Il programma un'implementazione dell'algoritmo RC4 . Il linguaggio utilizzato il PascalX (http://www.readyideas.com/pascalx.htm) . Spero ti sia d'aiuto . Buona programmazione :ciauz:



program ArCFour;

var
a:string[255];
b:string[255];
c:string[255];

function XOR(in1:char;in2:char):char;
var
i : integer;
x : integer;
y : integer;
o : integer;
begin
x:=in1;
y:=in2;
for i:=0 to 7 do
begin
if x mod 2<>y mod 2 then
o:=o+(2 POW i);
x:=x div 2;
y:=y div 2;
end;
XOR:=o;
end;

function RC4(intxt:string;key:string):string;

var
s:array [0..255] of char;
k:array [0..255] of char;
temp:char;
y:char;
c:char;
i:int;
j:int;
j1:int;
j2:int;
t:int;
x:int;
outxt:string[255];

begin

outxt:='';
for i:=0 to 255 do
s[i]:=i;
j:=1;
for i:=0 to 255 do
begin
if j>Length(key) then j:=1;
k[i]:=key[j];
j:=j+1;
end;
j:=0;
for i:=0 to 255 do
begin
j1:=s[i];
j2:=k[i];
j:=(j+j1+j2) mod 256;
temp:=s[i];
s[i]:=s[j];
s[j]:=temp;
end;
i:=0;
j:=0;
for x:=1 to Length(intxt) do
begin
i:=(i+1) mod 256;
j1:=s[i];
j:=(j+j1) mod 256;
temp:=s[i];
s[i]:=s[j];
s[j]:=temp;
j1:=s[i];
j2:=s[j];
t:=(j1+(j2 mod 256)) mod 256;
y:=s[t];
j1:=Xor(intxt[x],y);
outxt:=outxt+Chr(j1);
end;
RC4:=outxt;
end;

begin

a:='Stringa da criptare';
b:='key';
c:=RC4(a,b);
writeln('Stringa criptata');
writeln(c);
writeln('Stringa decriptata');
writeln(RC4(c,b));

end.

lomiz
26-11-2005, 18:51
Grazie a tutti e due! Volevo fare delle domande xk ci sono alcune cose che non ho ben capito:
-Che differenza c' tra il pascal e il pascalx?
-xk nell'implementazione dell'algoritmo RC4 non c' la dichiarazione della libreria? e se si fa il debug con la libreria c' un errore sulla dichiarazione della funzione XOR.

A quanto pare non sono ancora abbastanza bravo da capire il codice scritto da king64 quindi ho fatto un programma che cripta sfruttando il codice ascii come mi ha consigliato mico:

code:

Program cript;
uses crt;
var s:string;
i:integer;
begin
writeln('inserisci il messaggio da criptare');
readln(s);
for i:=1 to Length(s) do
Write((ord(s[i]))*2,'0');
repeat until keypressed;
end.


non riesco comunque a creare il programma che lo decripti. sapreste aiutarmi?
thank's
:ciauz:

king64
26-11-2005, 19:47
Originariamente inviato da lomiz
-Che differenza c' tra il pascal e il pascalx?


Il PascalX un compilatore Pascal che compila in modalit console .
Lo puoi scaricare all'indirizzo che ti ho linkato precedentemente . E' un compilatore molto leggero ke manca delle librerie come nel TP; le poche funzioni disponibili sono contenute nel compilatore stesso. Per questo ho dovuto implementare la funzione XOR presenta in compilatori piu completi . Comunque ha tutto quello che si chiede ad un Pascal essenziale.
Per quanto riguarda la funzione RC4 invece, ha il duplice scopo di crittare e decrittare la stringa ;come mostrato nel codice :



a:='Stringa da criptare';
b:='key';
c:=RC4(a,b); {* Critta la stringa *}
writeln('Stringa criptata');
writeln(c);
writeln('Stringa decriptata');
writeln(RC4(c,b)); {* Decritta la stringa *}


Spero di esserti stato d'aiuto :ciauz:

lomiz
26-11-2005, 22:01
Grazie. Sapresti comunque aiutarmi su quel codice di decriptazione sul programma che avevo postato prima?

code:

Program cript;
uses crt;
var s:string;
i:integer;
begin
writeln('inserisci il messaggio da criptare');
readln(s);
for i:=1 to Length(s) do
Write((ord(s[i]))*2,'0');
repeat until keypressed;
end.

:dh:

mico
27-11-2005, 00:40
x creare il codice che decripta in questo caso un po' pi complesso perche scrivendo una sequenza di cifre non distingui i vari codici ascii ... forse risolveresti utilizzando gli array!


Program decriptare;
uses crt;
const
max = 10;
type
ascii = array[1..max] of integer;
var
valori: ascii;
i: integer;
s: array[1..max] of char;
begin
ClrScr;
writeln('Inserisci la sequenza di codici ascii: ');
for i:=1 to max do
begin
read(valori[i]);
s[i]:=chr(valori[i]);
end;
writeln(s);
repeat until keypressed;
end.
solo che il problema di questo codice che posso scegliere solo un numero fisso di valori ascii (in questo caso 10) .. prova se ti va bene :bh:

lomiz
27-11-2005, 16:36
Non si puo dire al computer: leggi una sequenza di numeri finch non trovi un punto.
Cos da poter dividere le sequenze di cifre ascii?

king64
27-11-2005, 20:09
Originariamente inviato da lomiz
Grazie. Sapresti comunque aiutarmi su quel codice di decriptazione sul programma che avevo postato prima?




program decrit;

var
s,d,tmp:string[255];
i,j,l,k,m,n:integer;
flag:boolean;

begin
writeln('Inserisci la stringa da decrittare');
readln(s);
d:='';
l:=Length(s);
i:=1;
while i<l do
begin
j:=i;
tmp:='';
flag:=TRUE;
while flag do
begin
if s[j]<>'0' then
begin
tmp:=tmp+s[j];
j:=j+1;
end
else
begin
if s[j+1]='0' then
begin
tmp:=tmp+s[j];
j:=j+2;
end
else j:=j+1;
flag:=FALSE;
end;
end;
i:=j;
n:= Length(tmp);
m:=0;
for k:=1 to n do
m:=m+(ord(tmp[k])-48)*(10 Pow (n-k));
m:=m div 2;
d:=d+Chr(m);
end;
writeln('La stringa decrittata :');
writeln(d);
end.



Comunque tengo a sottilineare che , in generale, la sicurezza di un codice dovrebbe dipendere esclusivamente dalla segretezza della chiave e non da quella dell'algoritmo . Nel tuo caso il codice dipende solo dall'algoritmo , per cui , non sicuro . :D

mico
27-11-2005, 21:44
Originariamente inviato da lomiz
Non si puo dire al computer: leggi una sequenza di numeri finch non trovi un punto. penso che non si pu fare cos perche i numeri ascii sono di tipo "integer" mentre il punto di tipo "char"

Per king 64:

m:=m+(ord(tmp[k])-48)*(10 Pow (n-k));
ma cosa significa "pow" .. c' un errore o significa qualcosa?

Loading