Newsgroup: it.comp.lang.pascal
Titolo: [contiene listato di 95 righe] Per i maniaci di sicurezza :D

Lo so che questo non è proprio un problema di pascal ma non credo che 
nesusno si offenda { vero? } ho scritto in pascal un programma per un 
mio amico che voleva parlare con la fidanzata sensa che amici vedessero 
e ho scritto il seguente programma... secondo voi si può migliorare sia 
come sicurezza sica come efficenza?
Visto che non credo di aver inventato l'acqua calda qualcuno sa se esite 
  un nome per questo algoritmo? mi sono in parte ispirato al 
funzinamento della macchina Enigma usata durante la seconda guerra 
modiale { da qui il nome del programma :P }
secondo me la funzione MyOrd si potrebbe migliorare di molto con una 
mappa... secondo voi?
program Amgine;
const
	items = 86;
	item : array[ 0 .. items - 1 ] of char = (
		'1','2','3','4','5','6','7','8','9','0',
		'q','w','e','r','t','y','u','i','o','p',
		'a','s','d','f','g','h','j','k','l','z',
		'x','c','v','b','n','m','Q','W','E','R',
		'T','Y','U','I','O','P','A','S','D','F',
		'G','H','J','K','L','Z','X','C','V','B',
		'N','M','!','(',')','?','''','…','Š',' ',
		'‚',' ','•','—',',',';','.',':','+','-',
		'*','/','[',']','{','}'
	);
	itemsSet =
		['0'..'9'] +
		['a'..'z'] +
		['A'..'Z'] +
		['!'] + ['('] + [')'] + ['?'] + [''''] + ['…'] +
		['Š'] +	[' '] +	['‚'] +	[' '] +	['•'] +	['—'] +
		[','] +	[';'] +	['.'] +	[':'] +	['+'] +	['-'] +
		['*'] +	['/'] +	['['] +	[']'] + ['{'] + ['}'];
function MyOrd( Ch : Char ) : Integer;
var i : integer; found : boolean;
begin
	i := 0; found := false;
	while ( i < items ) and not found do begin
		found := item[i] = Ch;
		inc ( i );
	end;
	MyOrd := i - 1;
end;
function MyMod( A, B : Integer ) : Integer;
begin
	A := A MOD B;
	if A < 0 then A := A + B;
	MyMod := A;
end;
function Encode( Key, St : String ) : String;
var Out : String; I, K : Integer; Ch : Char; LastChar : Byte;
begin
	Out := ''; K := 0; LastChar := 0;
	For I := 1 To Length( St ) do begin
		Ch := St[I];
		if ( Ch in ItemsSet ) then begin
			K := MyMod(	MyOrd( Key[ MyMod( I - 1, length( Key ) ) + 1 ]	) + K + 
LastChar, Items );
			LastChar := MyMod( MyOrd( Ch ) + K, Items );
			Out := Out + Item[ LastChar ];
		end else
			Out := Out + Ch;
	end;
	Encode := Out;
end;
function Decode( Key, St : String ) : String;
var Out : String; I, K : Integer; Ch : Char; LastChar : Byte;
begin
	Out := '';	K := 0; LastChar := 0;
	for I := 1 to Length( St ) do begin
		Ch := St[I];
		if ( Ch in ItemsSet ) then begin
			K := MyMod(	MyOrd( Key[ MyMod( I - 1, length( Key ) ) + 1 ]	) + K + 
LastChar, Items );
			LastChar := MyOrd( Ch );
			Out := Out + Item[ MyMod( LastChar - K, Items ) ];
		end else
			Out := Out + Ch;
	end;
	Decode := Out;
end;
var Key, St : String;
begin
	WriteLn('Programma di codifica AMGINE' );
	WriteLn;
	repeat
		Write('Inserire password: '); ReadLn( Key );
		repeat
			Write('Cosa vuoi fare? [e/d/cp/exit] '); ReadLn( St );
			if St = 'e' then begin
				Write('Inserire frase da codificare: '); ReadLn( St );
				WriteLn('Frase codificata: "', Encode( Key, St ), '"' );
				St := '';
			end else if St = 'd' then begin
				Write('Inserire frase da decodificare: '); ReadLn( St );
				WriteLn('Frase decodificata: "', Decode( Key, St ), '"' );
				St := '';
			end;
		until ( St = 'exit' ) or ( St = 'cp' );
	until St = 'exit';
end.
-- 
Il Razziatore,
The Only Good Windows is an uninstalled Windows
-----------------------------------------------
MSN   : 
IlRazz...@netscape.net
ICQ   : 67552596
Yhaoo : Razziatore82
-----------------------------------------------
Founder of MediaPlayer Project
http://mpp.iwebland.com

 ha scritto nel messaggio 
news:4238d...@x-privat.org...


 
Dai... è abbastanza chiaro non dirmi che il grande RDC non lo capisce...
comunque la funzione
function MyOrd( Ch : Char ) : Integer;
cerca un carattere dentro al vettore Item e restituisce la sua posizione 
la funzione
function MyMod( A, B : Integer ) : Integer;
è una modifica di A MOD B ovvero il mod restituisce un numero compreso { 
in modulo } tra 0 e B ovvero:
-3 mod 3 = 0
-2 mod 3 = -2
-1 mod 3 = -1
0 mod 3 = 0
1 mod 3 = 1
2 mod 3 = 2
3 mod 3 = 0
mentre il mio resitusice un modulo circolare
-3 mod 3 = 0
-2 mod 3 = 1
-1 mod 3 = 2
0 mod 3 = 0
1 mod 3 = 1
2 mod 3 = 2
3 mod 3 = 0
all'inzio avevo usato MOD ma poi mi sono accorto che non funzionava la 
funzione di decodifica per i numeri negativi e allora ho introdoto qusta 
funzione
La funzione Encode data una password e una frase la codifica la funzione 
Decode data una password e una frase codificta la decodfica...
sono sostanzamente uguali { l'unica cosa che cambia è un - } prendiamo 
in analisi la funziona Encode òa prima cosa che faccio è verificare se 
Ch { il carattere corente } è all'interno del vettore { per fare questo 
uso i Set :D } dopo mi calcolo lo "sfasamneto" da usare ovvero uso la 
forumla
             K := MyMod(    MyOrd( Key[ MyMod( I - 1, length( Key ) ) + 
1 ]    ) + K + LastChar, Items );
per poi usare questo sfasamento sommato al carattere di partenza come 
indice da usare { l'unica differnza è proprio qui, in encode lo sommo e 
in decodo lo sottraggo }
             LastChar := MyMod( MyOrd( Ch ) + K, Items );
             Out := Out + Item[ LastChar ];
ovviamente se il carrattere non c'è nel set non lo codificio e lo lascio 
passare tranquillamente
             Out := Out + Ch;
Ritornando alla formula di sopra
             K := MyMod(    MyOrd( Key[ MyMod( I - 1, length( Key ) ) + 
1 ]    ) + K + LastChar, Items );
anche se secondo me è abbastanza chiaro... vediamo di spiegare cosa 
fa... in prarica somma alla lettera corende della password { i +1 e -1 
servono a spostare l'indice della password perke la password essendo una 
stringa fa da 1 a length() mentre l'array va da 0 a length - 1 }
Key[ MyMod( I - 1, length( Key ) ) + 1 ]
questo garantisce che ottengo una password infinita con all'interno la 
ripetizione di essa tipo se io ho la password "ciao" otterro
"ciaociaociaociao" ecc
e mi faccio ritornare l'indice { tramite MyOrd } della lettera corente 
della password che viene sommata a K { lo sfasamento precendete } e a 
LastChar { la lettera precendete } tanto per dare un po + di casualità :D
ecco in breve come funziona il mio algo...
ora che ve ne pare?


La costruzione della passphrase ripetendo in serie la password credo
sia un punto debole, magari potresti per ogni ripetizione fare una
rotazione dei caratteri crescente, prima di 1, poi 2, ecc. Temo
comunque che la sicurezza non migliori di molto (ammesso che
migliori), meglio cercare in rete. Perdonagli il C, pero' questo mi
sembra da zero a guru inferiore:
http://www.phrack.org/show.php?p=62&a=14
-- 
Omega e' omega e basta

Scusa ma ho solo ora un minuto e la domanda che mi è venuta in mente è 
questa
perchè fare tutto quel casino ? (si può dire casino ?) :P
Cmq l'aggettivo grande non si accosta al mio nick
Ciao
ReDiCuori
-- 
-- 
L'uomo non sa perchè si innamora, l'uomo viene travolto e basta


 Cmq l'aggettivo grande non si accosta al mio nick
Si accosta si accosta fidati ;)
PS: ma perke ogni tanto non vieni su IRC?
