19/03/08 11:03
eddiewrc
scusate (l'eventuale) ignoranza ma guardando il file cript.c a me sembra che il programma semplicemente prelevi 128 byte di dati da cifrare alla volta con questa struzione n=fread(buf,1,128,inf);
dopodichè controlla che siano stati effettivamente letti un numero corretto di dati con questa istr if(!n)break; e alla fine con questo for viene eseguita la cifratura:
for(i= 0,j= 0;i< n;buf[ i ]+=key[i%(len-1)],i++);
che si poteva scrivere tranquillamente come
for(i = 0,j = 0; i< n; i++);
buf[ i ] += key[i%(len-1)]
ovvero ad ogni byte del testo in chiaro viene sommato il valore del byte di posizione
i mod (lunghezza chiave - 1)
che fa in modo che anche se la chiave inserita è più corta del buffer di lettura (di 128 bytes) non vengano superati gli indici dell'array che contiene la chiave.
mi sembra quindi che questo algoritmo sia un cifrario a trasposizione polialfabetica, analogo alla "Chiffrè Indecifrable" proposta da Blaise de Vigenère nel 1586 e forzata da Charles Babbage 270 anni dopo. Le differenze sono che Vigenère usava 26 alfabeti e qui invece si rimanda alla lunghezza della password (che comunque difficilmente sarà di 26 caratteri, immagino.) e che lui faceva una somma modulo 26 (21 sono le lettere dell'alfabeto latino) mentre con la tabella ascii si hanno 256 possibili caratteri. Oltretutto la somma
buf[ i ] += key[i%(len-1)] non è "protetta" da nessun modulo, per cui se buf[ i ] = 'ù' e key[ i%(len-1)] = 'ù' il risultato sarà il carattere 256 che nn esiste nella tabella ascii.
l'algoritmo in generale NON è sicuro perchè i cifrari di questo tipo, anche se più complessi dei cugini monoalfabetici, sono comunque vulnerabili all'analisi statistica delle frequenze, per cui con qualche calcolo in più e un po' di fortuna sono risolvibili. C'è solo un caso in cui questo algoritmo (come gli altri simili) sono INDECIFRABILI, ovvero se si usa quella che viene detta One-Time-Pad: Claude Shannon ha dimostrato che l'algoritmo è inattaccabile se e solo se testo in chiaro e testo cifrato sono due variabili INDIPENDENTI, e quindi:
•la chiave, GENERATA CASUALMENTE, deve essere lunga ALMENO QUANDTO il messaggio che deve essere cifrato
•la chiave deve essere utilizzata una sola volta.
Hola! spero di essere stato esauriente e ogni correzione per (spero eventuali) errori è ben accetta!
dopodichè controlla che siano stati effettivamente letti un numero corretto di dati con questa istr if(!n)break; e alla fine con questo for viene eseguita la cifratura:
for(i= 0,j= 0;i< n;buf[ i ]+=key[i%(len-1)],i++);
che si poteva scrivere tranquillamente come
for(i = 0,j = 0; i< n; i++);
buf[ i ] += key[i%(len-1)]
ovvero ad ogni byte del testo in chiaro viene sommato il valore del byte di posizione
i mod (lunghezza chiave - 1)
che fa in modo che anche se la chiave inserita è più corta del buffer di lettura (di 128 bytes) non vengano superati gli indici dell'array che contiene la chiave.
mi sembra quindi che questo algoritmo sia un cifrario a trasposizione polialfabetica, analogo alla "Chiffrè Indecifrable" proposta da Blaise de Vigenère nel 1586 e forzata da Charles Babbage 270 anni dopo. Le differenze sono che Vigenère usava 26 alfabeti e qui invece si rimanda alla lunghezza della password (che comunque difficilmente sarà di 26 caratteri, immagino.) e che lui faceva una somma modulo 26 (21 sono le lettere dell'alfabeto latino) mentre con la tabella ascii si hanno 256 possibili caratteri. Oltretutto la somma
buf[ i ] += key[i%(len-1)] non è "protetta" da nessun modulo, per cui se buf[ i ] = 'ù' e key[ i%(len-1)] = 'ù' il risultato sarà il carattere 256 che nn esiste nella tabella ascii.
l'algoritmo in generale NON è sicuro perchè i cifrari di questo tipo, anche se più complessi dei cugini monoalfabetici, sono comunque vulnerabili all'analisi statistica delle frequenze, per cui con qualche calcolo in più e un po' di fortuna sono risolvibili. C'è solo un caso in cui questo algoritmo (come gli altri simili) sono INDECIFRABILI, ovvero se si usa quella che viene detta One-Time-Pad: Claude Shannon ha dimostrato che l'algoritmo è inattaccabile se e solo se testo in chiaro e testo cifrato sono due variabili INDIPENDENTI, e quindi:
•la chiave, GENERATA CASUALMENTE, deve essere lunga ALMENO QUANDTO il messaggio che deve essere cifrato
•la chiave deve essere utilizzata una sola volta.
Hola! spero di essere stato esauriente e ogni correzione per (spero eventuali) errori è ben accetta!
Ultima modifica effettuata da eddiewrc 19/03/08 11:05
aaa