Newsgroup: it.comp.programmare.win32
Titolo: Crittografia

Salve a tutti.
Da vero neofita, avrei la necessita di criptare o crittografare (che
differenza c'é? ) un stringa e/o un array di dati o byte che siano.
Che Api devo cercare, che funzionalita devo esaminare, qualche link
con del codice da scopiazzare...
Grazie in anticipo
Marco

 con del codice da scopiazzare...
neanche io sono molto esperto ma ad un corso universitario (il corso vero
e proprio di Crittografia lo devo ancora fare: è della specialistica) mi è
stata data un'introduzione alla materia.
per quanto riguarda la crittografia simmetrica: in origine fu il DES, il
quale però a causa delle leggi americane scassapalle era relativamente
troppo debole (usava chiavi non molto piccole ma comunque crakkabili
avendo abbastanza risorse: 48 bit se non erro); di conseguenza qualcuno
molto furbo inventò un modo particolare di usare il DES, ovvero il
*triplo* DES: lo applichi tre volte utilizzando due chiavi diverse da 48
bit ciascuna in questo modo:
per criptare fai E(k1), poi D(k2), poi E(k1)
per decriptare D(k1), E(k2), D(k1)
dove k1 e k2 sarebbero le due chiavi, E(k) vuol dire cripta con la chiave
k, e D(k) vuol dire decripta con la chiave k.
non so però come la pensino le leggi scassapalle in merito al triplo DES.
poi siccome a un certo punto un'altra fetta di america s'era rotta i
maroni di fare sti giochetti per avere un po' di sacrosanta privacy e una
tecnologia crittografica decente, allora nacquero AES e anche IDEA:
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
http://en.wikipedia.org/wiki/International_Data_Encryption_Algorithm
su Wikipedia trovi la descrizione dei due algoritmi e se guardi in fondo
alla pagina di AES mi pare che quelli alla fine siano link alle
implementazioni più conosciute (non ho letto attentamente, ho dato solo
un'occhiata).
se invece la crittografia simmetrica non ti basta e hai addirittura la
possibilità di usare coppie di chiavi pubblica/privata, allora puoi
cimentarti con la crittografia asimmetrica, sicuramente migliore; in tal
caso documentati sui fondamentali, come l'RSA e l'algoritmo di
Diffie-Hellman, e poi tenendo presente che la crittografia asimmetrica è
un po' più onerosa di quella simmetrica puoi o progettare un algoritmo in
stile SSL (prima fai un handshake e ti scambi in maniera sicura la chiave
simmetrica, e poi ci vai di crittografia simmetrica) oppure applicare
direttamente solo la crittografia asimmetrica (Tizio cripta con la chiave
pubblica di Caio, Caio decripta con quella privata).
to':
http://en.wikipedia.org/wiki/Rsa
http://en.wikipedia.org/wiki/Diffie_hellman
infine concludo dicendo che se quella che vuoi proteggere è una
comunicazione di rete tra due parti allora lascia proprio perdere il
fai-da-te che è inutile: usa direttamente un toolkit SSL (come OpenSSL o
come quello integrato nelle classi di networking di Java) che non devi
neanche documentarti e ci pensa a tutto lui. SSL ti crea un canale sicuro
a prova di intercettazione passiva, attiva, replay attacks, e quant'altro.
http://www.openssl.org/
http://java.sun.com/javase/6/docs/api/index.html?javax/net/ssl/package-summary.html
c'è chi dice che SSL durerà solo qualche altro decennio perché con
l'avvento dei computers quantici (computers in grado di assumere più stati
contemporaneamente) risolvere il problema di fondo che impedisce il crack
di una comunicazione SSL (ovvero la fattorizzazione di un numero primo
gigantesco) sarà questione di secondi; però, bah, chissenefrega :P chi
vivrà vedrà.
e con questo penso di averti fatto una rapida carrellata di crittografia
pragmatica :PPP
spero di averti aiutato, anche se temo di averti solo confuso le idee ^^
ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

ciao
Grazie per la carrallata, un pò di teoria serve sempre.
Che corso e in che universita dovresti seguire, se posso chiedertelo?
Io sono vicino a Torino.
Sono cmq alla ricerca anche di pezzi di codice per poter implementare
in fretta la semplice crittografia di una password, da memorizzare in
locale su un applicativo VB: niente SSL o scambio di chiavi; 
devo mettere una password per regolamentare degli accessi, ma no ci
sono veri dati sensibili da difendere.
Grazie
Marco


Ti consiglio vivamente q. libro:
Crittografia Principi Algoritmi Applicazioni
di Fabrizio Luccio e Paolo Ferragina
Bollati Boringhieri

Bollati Boringhieri
Meditero sull'acquisto, grazie!
Se qualcuno avesse quanche esempio di  codice sarebbe cmq bene
accetto.
Grazie
Marco

 sono veri dati sensibili da difendere.
ah, ma allora la cosa è più semplice. solitamente in questi casi non si
cripta, ma si hasha: è tipico per una password calcolare l'hash SHA o MD5
o quello che ti pare ed utilizzare sempre e solo gli hash per fare i
confronti tra la password inserita dall'utente e quella vera. inoltre la
password vera non viene memorizzata ne' in chiaro ne' in versione
criptata, poiché entrambe le cose sarebbero insicure: trattandosi di una
memorizzazione a lungo termine, a lungo andare qualcuno con molte risorse
potrebbe trovare la chiave. ciò che si fa invece è memorizzare l'hash
della password, perché un hash è "monodirezionale": è una funzione per
definizione facile da calcolare e praticamente impossibile da invertire.
ad una sequenza di bytes corrisponde un solo hash, ma ad un hash
corrispondono infinite sequenze di bytes, e le collisioni sono quasi
impossibili. una funzione di hash studiata come si deve insomma è un
capolavoro di matematica e statistica :)
come algoritmo di hashing ti consiglio SHA perché Wikipedia dice che è
meglio di MD5, del quale invece sembra essere stata trovata una
vulnerabilità che in certe condizioni favorevoli permette l'inversione in
tempi non irragionevoli, a portata di memorizzazione a lungo termine per
così dire.
in sostanza quindi ciò che devi fare è:
1) l'utente inserisce la password per la prima volta nelle due classiche
text boxes ad asterischi "insert password" e "confirm"; tu le confronti
per vedere se l'utente le ha scritte bene
2) calcoli l'hash SHA della password e lo memorizzi nel file che ti pare
3) la password originale non ti serve più: rasa le due text boxes e azzera
fisicamente tutte le aree di memoria che hai usato per calcolare l'hash; e
bada alle cache (c'è un'API Win32 che si chiama SecureZeroMemory: è molto
istruttiva)
4) l'utente riavvia il programma e inserisce la password
5) tu la prendi, rasi la text box, calcoli l'hash, e azzeri le aree di
memoria usate per il calcolo
6) confronti gli hash e se coincidono ok, altrimenti mostri un'animazione
con la tua faccia sorridente tipo Jurassic Park: "HA-HA-HAAA - NON HAI
DETTO LA PAROLA MAGICA - HA-HA-HAAA - HA-HA-HAAA"
qua il link alla descrizione di SHA su Wikipedia:
http://en.wikipedia.org/wiki/SHA_hash_functions
e qui quello della descrizione su MSDN dell'API SecureZeroMemory:
http://msdn2.microsoft.com/en-us/library/aa366877.aspx
è identica alla macro ZeroMemory, solo che invalida anche la cache.
PS: sapevo che anche Linux usa questo sistema, con MD5 se non erro.


to'... hai detto che usi Visual Basic? guarda che c'era su Wikipedia:
http://www.tayloredge.com/utilities/vbapps/SHA1_VBSource.txt
:)


 è identica alla macro ZeroMemory, solo che invalida anche la cache.
ehm, pardon: volevo dire *flusha* la cache, non invalida.


ciao
Grazie per il codice.
Per questa settimana purtroppo devo passare ad altri argomenti, ma da
lunedi comincierò a lavorarci.
Stay tuned!
Ciao
Marco