Newsgroup: it.comp.sicurezza.varie
Titolo: Algoritmo di criptazione

Ciao a tutti...
Qualcuno saprebbe consigliarmi il miglior algoritmo algoritmo di cryptazione
che poter essere utilizzato in fase di sviluppo tramite dll?
Grazie in anticipo...
Ciao, Alfonso.

 ha scritto nel messaggio
news:K8TG7.28832$zl4.8...@news2.tin.it...

Miglior algoritmo? E' una domanda ardua, a cui esistono troppe risposte.
Innanzitutto, a cosa ti serve? Intendo dire che esistono due classi di
algoritmi di cifratura: simmetriche e asimmetriche.
Gli algoritmi simmetrici usano la stessa chiave per cifrare e decifrare,
sono veloci e solitamente robusti. L'unico difetto che hanno è intrinseco...
ed è lo scambio delle chiavi con un destinatario con il quale non ho
un'altro canale sicuro.
Non scendo nei dettagli, diciamo che hai bisogno di una chiave per
destinatario, dalla cui segretezza dipende la sicurezza del cifrato.
Se non hai probemi di scambio, puoi scegliere fra BLOWFISH, CAST, IDEA (128
bit) o anche 3-DES (112 bit) dei quali, con un pochino di maledizioni, puoi
trovare anche i codici sorgenti.
Sono tutti "collaudati" da migliaia di privati che non hanno trovato falle
logiche o vulnerabilità diverse dalla forza bruta, inapplicabile su simili
chiavi.
Gli algoritmi asimmetrici usano una coppia di chiavi (pubblica e privata),
rispettando questi due assunti:
1. Le chiavi sono complementari, nel senso che quello che viene cifrato con
una di esse puòessere decifrato solo usando l'altra.
2. Nota una chiave non è possibile ricavare la complementare.
Così può essere risolto il problema dello scambio delle chiavi... invio su
un qualsiasi canale solo la mia chiave pubblica, e nessuno (tranne me) può
leggere i messaggi con essa cifrati.
Gli algoritmi asimmetrici sono però molto lenti, al punto che vengono usati
per trasmettere solo una chiave di sessione per algoritmi simmetrici.
In questo caso la scelta è minore... RSA e Dizzie-Helfmann. Forse puoi
trovare il sorgente dell'RSA, ma non ti garantisco.
Tutti gli algoritmi che ti ho citato sono considerati sicuri... ma non so
che ne pensa in merito l'NSA :-)
Roberto

 sorgenti. 
Aggiungerei anche Rijndael
http://www.esat.kuleuven.ac.be/~rijmen/rijndael/
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 ha scritto nel messaggio
news:hZ9H7.59015$sq5.2...@news.infostrada.it...
Ti ringrazio per la risposta esaustiva.
Credo che gli algoritmi simmetrici possano fare al caso mio, in quanto la
chiave sara' contenuta solo all'interno del programma e non verra' diffusa.
Mi occorre un algotirmo per realizzare una protezione di un programma
tramite registro di configurazione di windows e smart card.
Grazie ancora...
Ciao, Alfonso.


http://www.esat.kuleuven.ac.be/~rijmen/rijndael/
per caso è quello a 348 bit?

 tramite registro di configurazione di windows e smart card.
Se sei orientato verso gli algoritmi a chiave simmetrica (e credo che sia la
scelta giusta), il NIST (
csrc.nist.gov
) ha sviluppato recentemente uno
standard di crittografia chiamato Advanced Encryption Standard. Il codice
sorgente è disponibile per tutti gli algoritmi dell'AES.
I vari algoritmi offrono la possibilità di usare chiavi da 128, 192, 256
bit, sono stati sottoposti a molti test di ogni tipo e ad analisi da parte
di valenti matematici per cui io mi limiterei a prendere in considerazione
soltanto tali algoritmi, lasciando perdere i vecchi sistemi di cifratura.
Io sto ultimando l'implementazione di un programma per cifrare file usando
RC6, Rijndael (vincitore della selezione per l'AES) e Serpent in modalità
ECB e CBC (come previsto dall'AES).
L'esigenza di utilizzare tre algoritmi invece di uno soltanto è dettata
principalmente dal fatto di poter variare velocità e sicurezza in funzione
dell'importanza del file da crittare. Infatti l'RC6 può essere molto veloce
ma poco "robusto", mentre Serpent offre un'alta protezione a discapito della
velocità (per approfondimenti è consigliabile leggere la documentazione di
ogni algoritmo).
Non capisco bene cosa intendi con "la chiave sara' contenuta solo
all'interno del programma" ma ti suggerisco di fare molta attenzione a come
viene generata, memorizzata e utilizzata la chiave. E' la cosa più
importante!
Buon lavoro
Cristiano

 importante!
Intendo che la chiave sara' una cosa del tipo:
cryptokey="43rfh09843u3dh39"
Userei sempre questa chiave per cryptare dei dati contenuti in una smart
card e nel registro di configurazione.
Cosa mi consigli per generare la chiave, memorizzarla e utilizzarla?


Sapresti indicarmi una libreria che contenga gli algoritmi AES e che possa
essere utilizzata dai vari linguaggi di programmazione ad alto livello?
(magari anche free)
Grazie...
Ciao, Alfonso.

 utilizzarla? Grazie in anticipo...
Stai attento che una catena č forte come il suo anello piů debole...
Se utilizzi un sistema di crittografia supersicuro ma memorizzi la 
chiave in modo non-sicuro č possibile che un eventuale "intruso" decida 
di forzare quel punto, senza curarsi della crittografia.
Dai un'occhiata a questo link per capire cosa intendo:
http://www.cl.cam.ac.uk/~rnc1/descrack/


 chiave sara' contenuta solo all'interno del programma e non verra' diffusa.
Il che non ti garantisce che non possa essere recuperata, dato che
avendo a disposizione il programma, anche compilato, potrebbe essere una
caxxata recuperarla.
HappyCactus
-- 
Keyboard not present or keyboard error
Press F1 to resume

 caxxata recuperarla.
Intendi con un debugger (tipo SoftIce)?
Cosa mi consigli per rendere il codice + sicuro?
Grazie...
Ciao, Alfonso.

 di forzare quel punto, senza curarsi della crittografia.
Infatti hai perfettamente ragione... ma + che memorizzare la chiave (o le
chiavi) in una variabile all'interno del programma stesso cosa posso fare?
Ho seguito il tuo link... molto interessante...
Credi che cmq il 3DES possa essere sufficentemente sicuro? Credo di si,
anche se in precedenza mi e' stato consigliato un algoritmo di AES.
Ciao, Alfonso.

 
Se non hai problemi per la dimensione delle chiavi (devi crittografare 
pochi byte alla volta e quindi "giustificarli" a blocchi di 256 ti crea 
problemi) oppure limiti sulla capacità di elaborazione richiesta ti 
consiglio di utilizzare rijndael (AES):
http://www.esat.kuleuven.ac.be/~rijmen/rijndael/


 Cosa mi consigli per generare la chiave, memorizzarla e utilizzarla?
Io lascerei perdere le chiavi alfanumeriche; utilizzerei, invece, una chiave
puramente numerica, cioè una chiave da 128 bit deve permettere di ottenere
2^128 valori.
Nel mio programma cui ti accennavo ho scelto due modi per generare la
chiave:
1) inserisci una parola di senso compiuto che puoi ricordare facilmente e
poi la espandi iterando molte volte un algoritmo di hash in modo che duri
circa 1 o 2 secondi. Ad esempio, la tua chiave sia IcemaN (ovviamente ne
userai un'altra!); converti la parola in un numero intero e lo hashi
(utilizzando per esempio sha-2 da 256 bit); il risultato dell'hash lo
ri-hashi ripetutamente in modo che questo processo richieda circa 1 o 2
secondi; la tua chiave sarà composta da 128 bit dell'hash (li puoi scegliere
a partire da un punto qualunque dell'hash risultante).
Hashare ripetutamente la stessa chiave iniziale obbliga un ipotetico
impiccione che intendesse fare un attacco di forza bruta a perdere 1 o 2
secondi per tentare ogni chiave possibile.
Vantaggi: la chiave la sai solo tu.
Svantaggi: se ti prende un attacco d'amnesia... addio! :-) Una chiave così
generata lunga n bit ha un'entropia (cioè un'informazione effettivamente
utile) molto minore di n bit.
2) usi un generatore di numeri (pseudo-) casuali *crittograficamente
sicuro*. Ovviamente devi salvare la chiave da qualche parte.
Vantaggi: l'entropia della chiave è appena inferiore o addirittura uguale
alla lunghezza della chiave.
Svantaggi: qualcuno potrebbe trovare la chiave memorizzata da qualche parte.
Per ciò che riguarda la cifratura/decifratura conviene senz'altro prevedere
la modalità CBC e utilizzare un vettore d'inizializzazione possibilmente
lungo 1 blocco (128 bit). Questo al fine di evitare particolari attacchi.
Al di là di ogni consiglio pratico che ti si possa dare, vorrei darti un
ultimo consiglio veramente importante: se i dati da proteggere sono per te
realmente importanti, dovresti implementare il programma soltanto dopo aver
ben chiari i vari sistemi di cifratura e le varie tecniche d'attacco
possibili. Nel web puoi trovare un'infinità di documenti (in inglese) che
riguardano la crittografia.
Cristiano

Cosa mi consigli per rendere il codice + sicuro?
Facendo credere che sei fesso e che non capisci niente. Riempendo il 
codice di chiavi fasulle generate da strampalati algoritmi, di chiamate 
inutili alla funzione di criptazione. Usa un sacco di goto inutili. Se 
usi C++, vai giù pesante di metodi virtuali, rendi il codice un inferno 
da debuggare. Gioca a fare il programmatore della domenica che non è 
capace a scrivere nemmeno un hello world. Se puoi ricorrere 
all'assembly, aggiungi qua e là roba del tipo:
__asm{
 NOP
 NOP
 NOP
// ad nauseam
}
in modo che pensino, invece, che sei furbo come una volpe e stai facendo 
spazio per del codice generato dinamicamente. Usa i classici trucchi 
anti-crack (ad esempio chiamare in asincrono delle procedure con un 
timer) per proteggere quelli che in realtà sono vicoli ciechi. Salvati 
dentro l'eseguibile un file criptato con relativa chiave, decrittalo su 
disco e fai finta di leggerlo (ma dentro c'è solo spazzatura che avrai 
generato a random). Scaricati qualche tutorial sul cracking e impara 
dagli errori altrui
-- 
Nato nel vizio, morto nel supplizio
Nato nel peccato, ad entrare sia invitato

 Facendo credere che sei fesso e che non capisci niente.
LOL !!
Bye, G.
P.S.: Hyper... ?

P.S.: Hyper... ?
Hyperion s'č preso un periodo di vacanza, lo sostituisco io che sono una 
persona molto piů sana ed equilibrata :)


 Ciao, Alfonso.


 Intendi con un debugger (tipo SoftIce)?
Basta anche il comando strings disponibile su un qualsiasi sistema Unix.
-- 
"Ehi, fratelli. Qui c'e' scritto che c'e' anche il tempo per combattere".
SecurFaq             : 
http://securfaq.usenet.eu.org
Biancorossi Siamo Noi: 
http://www.tifonet.it/free/ancona/

 obscurity": dovresti rendere il codice inacessibile al pubblico....
E dove potrei memorizzarla?
Nel registro di configurazione? Mi sembra troppo banale...
O nella smart card stessa? Anche qui ho dei dubbi...
Come posso utilizzare una chiave non memorizzata?
Ciao, Alfonso.

"|IcemaN|" ha scritto:

Il metodo n°1 che ti ho indicato più sopra non ti piace? Ti assicuro che è
un sistema molto pratico e anche piuttosto sicuro.
Cristiano

 Ciao, Alfonso.
Pensavo alla memoria dell'utente.
Pero' non e' detto che per la tua applicazione sia fattibile...
In alternativa, vale quanto ti ha suggerito andre' linoge (ottimo post,
salvato e incorniciato!)
HappyCactus

 un sistema molto pratico e anche piuttosto sicuro.
Sisi certo ho salvato il mex e credo proprio che faccia al caso mio, ti
ringrazio...
Anzi... se posso appena avro' tempo di implementare la soluzione ti
chiedero' qualche altra spiegazione in merito ;)
Grazie...
Ciao, Alfonso.